diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2018-12-18 09:15:41 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2018-12-18 09:15:41 +0200 |
commit | 45531949ae115f2ba7b9450cc2386653483211ba (patch) | |
tree | 22809f3919c711d5030d2d0e55be969a7bc67e84 /sql | |
parent | 36b7f8f4b0e46e06cfcc29c221430a5b998e3b3f (diff) | |
parent | ed13a0d221256028299df4167280e97860ba2edc (diff) | |
download | mariadb-git-45531949ae115f2ba7b9450cc2386653483211ba.tar.gz |
Merge 10.2 into 10.3
Diffstat (limited to 'sql')
-rw-r--r-- | sql/field.cc | 33 | ||||
-rw-r--r-- | sql/item.cc | 15 | ||||
-rw-r--r-- | sql/item.h | 1 | ||||
-rw-r--r-- | sql/item_create.cc | 2 | ||||
-rw-r--r-- | sql/item_func.cc | 3 | ||||
-rw-r--r-- | sql/item_strfunc.cc | 6 | ||||
-rw-r--r-- | sql/item_timefunc.cc | 8 | ||||
-rw-r--r-- | sql/share/errmsg-utf8.txt | 4 | ||||
-rw-r--r-- | sql/sql_class.cc | 9 | ||||
-rw-r--r-- | sql/sql_select.cc | 2 | ||||
-rw-r--r-- | sql/sql_table.cc | 21 | ||||
-rw-r--r-- | sql/sql_time.cc | 44 | ||||
-rw-r--r-- | sql/sql_time.h | 15 |
13 files changed, 113 insertions, 50 deletions
diff --git a/sql/field.cc b/sql/field.cc index 5a8192f6e62..fbaf3c6ea91 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -2082,7 +2082,7 @@ bool Field_int::get_date(MYSQL_TIME *ltime,ulonglong fuzzydate) longlong nr= val_int(); bool neg= !(flags & UNSIGNED_FLAG) && nr < 0; return int_to_datetime_with_warn(neg, neg ? -nr : nr, ltime, fuzzydate, - field_name.str); + table->s, field_name.str); } @@ -3421,7 +3421,8 @@ bool Field_new_decimal::get_date(MYSQL_TIME *ltime, ulonglong fuzzydate) { my_decimal value; return decimal_to_datetime_with_warn(val_decimal(&value), - ltime, fuzzydate, field_name.str); + ltime, fuzzydate, table->s, + field_name.str); } @@ -4875,7 +4876,8 @@ bool Field_real::get_date(MYSQL_TIME *ltime,ulonglong fuzzydate) { ASSERT_COLUMN_MARKED_FOR_READ; double nr= val_real(); - return double_to_datetime_with_warn(nr, ltime, fuzzydate, field_name.str); + return double_to_datetime_with_warn(nr, ltime, fuzzydate, + table->s, field_name.str); } @@ -6394,7 +6396,7 @@ bool Field_year::get_date(MYSQL_TIME *ltime,ulonglong fuzzydate) if (tmp || field_length != 4) tmp+= 1900; return int_to_datetime_with_warn(false, tmp * 10000, - ltime, fuzzydate, field_name.str); + ltime, fuzzydate, table->s, field_name.str); } @@ -8942,10 +8944,18 @@ int Field_geom::store(const char *from, size_t length, CHARSET_INFO *cs) geom_type != Field::GEOM_GEOMETRYCOLLECTION && (uint32) geom_type != wkb_type) { + const char *db= table->s->db.str; + const char *tab_name= table->s->error_table_name(); + + if (!db) + db= ""; + if (!tab_name) + tab_name= ""; + my_error(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD, MYF(0), Geometry::ci_collection[geom_type]->m_name.str, Geometry::ci_collection[wkb_type]->m_name.str, - field_name.str, + db, tab_name, field_name.str, (ulong) table->in_use->get_stmt_da()-> current_row_for_warning()); goto err_exit; @@ -11228,7 +11238,8 @@ void Field::set_datetime_warning(Sql_condition::enum_warning_level level, { THD *thd= get_thd(); if (thd->really_abort_on_warning() && level >= Sql_condition::WARN_LEVEL_WARN) - make_truncated_value_warning(thd, level, str, ts_type, field_name.str); + make_truncated_value_warning(thd, level, str, ts_type, + table->s, field_name.str); else set_warning(level, code, cuted_increment); } @@ -11238,10 +11249,18 @@ void Field::set_warning_truncated_wrong_value(const char *type_arg, const char *value) { THD *thd= get_thd(); + const char *db_name= table->s->db.str; + const char *table_name= table->s->error_table_name(); + + if (!db_name) + db_name= ""; + if (!table_name) + table_name= ""; + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, ER_TRUNCATED_WRONG_VALUE_FOR_FIELD, ER_THD(thd, ER_TRUNCATED_WRONG_VALUE_FOR_FIELD), - type_arg, value, field_name.str, + type_arg, value, db_name, table_name, field_name.str, static_cast<ulong>(thd->get_stmt_da()-> current_row_for_warning())); } diff --git a/sql/item.cc b/sql/item.cc index 71a9afd6a9d..a26f1eac5ba 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -544,6 +544,15 @@ Item::Item(THD *thd): } +const TABLE_SHARE *Item::field_table_or_null() +{ + if (real_item()->type() != Item::FIELD_ITEM) + return NULL; + + return ((Item_field *) this)->field->table->s; +} + + /** Constructor used by Item_field, Item_ref & aggregate (sum) functions. @@ -1450,6 +1459,7 @@ bool Item::get_date_from_int(MYSQL_TIME *ltime, ulonglong fuzzydate) bool neg= !unsigned_flag && value < 0; if (null_value || int_to_datetime_with_warn(neg, neg ? -value : value, ltime, fuzzydate, + field_table_or_null(), field_name_or_null())) return null_value|= make_zero_date(ltime, fuzzydate); return null_value= false; @@ -1470,6 +1480,7 @@ bool Item::get_date_from_year(MYSQL_TIME *ltime, ulonglong fuzzydate) value*= 10000; /* make it YYYYMMHH */ if (null_value || int_to_datetime_with_warn(false, value, ltime, fuzzydate, + field_table_or_null(), field_name_or_null())) return null_value|= make_zero_date(ltime, fuzzydate); return null_value= false; @@ -1480,6 +1491,7 @@ bool Item::get_date_from_real(MYSQL_TIME *ltime, ulonglong fuzzydate) { double value= val_real(); if (null_value || double_to_datetime_with_warn(value, ltime, fuzzydate, + field_table_or_null(), field_name_or_null())) return null_value|= make_zero_date(ltime, fuzzydate); return null_value= false; @@ -1491,6 +1503,7 @@ bool Item::get_date_from_decimal(MYSQL_TIME *ltime, ulonglong fuzzydate) my_decimal value, *res; if (!(res= val_decimal(&value)) || decimal_to_datetime_with_warn(res, ltime, fuzzydate, + field_table_or_null(), field_name_or_null())) return null_value|= make_zero_date(ltime, fuzzydate); return null_value= false; @@ -4286,7 +4299,7 @@ void Item_param::set_time(MYSQL_TIME *tm, timestamp_type time_type, { ErrConvTime str(&value.time); make_truncated_value_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, - &str, time_type, 0); + &str, time_type, 0, 0); set_zero_time(&value.time, time_type); } maybe_null= 0; diff --git a/sql/item.h b/sql/item.h index 8bb3aa33c78..adfc8e4bc6e 100644 --- a/sql/item.h +++ b/sql/item.h @@ -1273,6 +1273,7 @@ public: virtual const char *full_name() const { return name.str ? name.str : "???"; } const char *field_name_or_null() { return real_item()->type() == Item::FIELD_ITEM ? name.str : NULL; } + const TABLE_SHARE *field_table_or_null(); /* *result* family of methods is analog of *val* family (see above) but diff --git a/sql/item_create.cc b/sql/item_create.cc index ab91e378be3..84f2c91ba54 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -7494,7 +7494,7 @@ Item *create_temporal_literal(THD *thd, ErrConvString err(str, length, cs); make_truncated_value_warning(thd, Sql_condition::time_warn_level(status.warnings), - &err, ltime.time_type, 0); + &err, ltime.time_type, 0, 0); } return item; } diff --git a/sql/item_func.cc b/sql/item_func.cc index c5ac97f2905..f902191d9cf 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -844,6 +844,7 @@ bool Item_func_hybrid_field_type::get_date_from_decimal_op(MYSQL_TIME *ltime, my_decimal value, *res; if (!(res= decimal_op_with_null_check(&value)) || decimal_to_datetime_with_warn(res, ltime, fuzzydate, + field_table_or_null(), field_name_or_null())) return make_zero_mysql_time(ltime, fuzzydate); return (null_value= 0); @@ -882,6 +883,7 @@ bool Item_func_hybrid_field_type::get_date_from_int_op(MYSQL_TIME *ltime, bool neg= !unsigned_flag && value < 0; if (null_value || int_to_datetime_with_warn(neg, neg ? -value : value, ltime, fuzzydate, + field_table_or_null(), field_name_or_null())) return make_zero_mysql_time(ltime, fuzzydate); return (null_value= 0); @@ -917,6 +919,7 @@ bool Item_func_hybrid_field_type::get_date_from_real_op(MYSQL_TIME *ltime, { double value= real_op(); if (null_value || double_to_datetime_with_warn(value, ltime, fuzzydate, + field_table_or_null(), field_name_or_null())) return make_zero_mysql_time(ltime, fuzzydate); return (null_value= 0); diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index fda7f59b128..8e4f4232959 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -5141,7 +5141,7 @@ bool Item_dyncol_get::get_date(MYSQL_TIME *ltime, ulonglong fuzzy_date) bool neg = llval < 0; if (int_to_datetime_with_warn(neg, (ulonglong)(neg ? -llval : llval), - ltime, fuzzy_date, 0 /* TODO */)) + ltime, fuzzy_date, 0, 0 /* TODO */)) goto null; return 0; } @@ -5150,12 +5150,12 @@ bool Item_dyncol_get::get_date(MYSQL_TIME *ltime, ulonglong fuzzy_date) /* fall through */ case DYN_COL_DOUBLE: if (double_to_datetime_with_warn(val.x.double_value, ltime, fuzzy_date, - 0 /* TODO */)) + 0, 0 /* TODO */)) goto null; return 0; case DYN_COL_DECIMAL: if (decimal_to_datetime_with_warn((my_decimal*)&val.x.decimal.value, ltime, - fuzzy_date, 0 /* TODO */)) + fuzzy_date, 0, 0 /* TODO */)) goto null; return 0; case DYN_COL_STRING: diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 4d17bc354d4..25fecd0a134 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -431,7 +431,7 @@ static bool extract_date_time(DATE_TIME_FORMAT *format, make_truncated_value_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, val_begin, length, - cached_timestamp_type, NullS); + cached_timestamp_type, 0, NullS); break; } } while (++val != val_end); @@ -1834,13 +1834,13 @@ overflow: { ErrConvInteger err2(sec, unsigned_flag); make_truncated_value_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, - &err2, MYSQL_TIMESTAMP_TIME, NullS); + &err2, MYSQL_TIMESTAMP_TIME, 0, NullS); } else { ErrConvString err2(err); make_truncated_value_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, - &err2, MYSQL_TIMESTAMP_TIME, NullS); + &err2, MYSQL_TIMESTAMP_TIME, 0, NullS); } return 0; } @@ -2893,7 +2893,7 @@ bool Item_func_maketime::get_date(MYSQL_TIME *ltime, ulonglong fuzzy_date) int len = (int)(ptr - buf) + sprintf(ptr, ":%02u:%02u", (uint)minute, (uint)second); make_truncated_value_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, buf, len, MYSQL_TIMESTAMP_TIME, - NullS); + 0, NullS); } return (null_value= 0); diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index a60ddeb3017..9112795b754 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -5449,8 +5449,8 @@ ER_DIVISION_BY_ZERO 22012 ger "Division durch 0" hindi "0 से विभाजन" ER_TRUNCATED_WRONG_VALUE_FOR_FIELD 22007 - eng "Incorrect %-.32s value: '%-.128s' for column '%.192s' at row %lu" - ger "Falscher %-.32s-Wert: '%-.128s' für Feld '%.192s' in Zeile %lu" + eng "Incorrect %-.32s value: '%-.128s' for column `%.192s`.`%.192s`.`%.192s` at row %lu" + ger "Falscher %-.32s-Wert: '%-.128s' für Feld '`%.192s`.`%.192s`.`%.192s` in Zeile %lu" ER_ILLEGAL_VALUE_FOR_TYPE 22007 eng "Illegal %s '%-.192s' value found during parsing" ger "Nicht zulässiger %s-Wert '%-.192s' beim Parsen gefunden" diff --git a/sql/sql_class.cc b/sql/sql_class.cc index a42a2f5afdd..3881f6f28ad 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -3238,6 +3238,10 @@ int select_export::send_data(List<Item> &items) error_pos= copier.most_important_error_pos(); if (unlikely(error_pos)) { + /* + TODO: + add new error message that will show user this printable_buff + char printable_buff[32]; convert_to_printable(printable_buff, sizeof(printable_buff), error_pos, res->ptr() + res->length() - error_pos, @@ -3247,6 +3251,11 @@ int select_export::send_data(List<Item> &items) ER_THD(thd, ER_TRUNCATED_WRONG_VALUE_FOR_FIELD), "string", printable_buff, item->name.str, static_cast<long>(row_count)); + */ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_TRUNCATED_WRONG_VALUE_FOR_FIELD, + ER_THD(thd, WARN_DATA_TRUNCATED), + item->name.str, static_cast<long>(row_count)); } else if (copier.source_end_pos() < res->ptr() + res->length()) { diff --git a/sql/sql_select.cc b/sql/sql_select.cc index ce8617cda64..ddc5a25bd07 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -22777,9 +22777,11 @@ static int remove_dup_with_compare(THD *thd, TABLE *table, Field **first_field, } file->extra(HA_EXTRA_NO_CACHE); + (void) file->ha_rnd_end(); DBUG_RETURN(0); err: file->extra(HA_EXTRA_NO_CACHE); + (void) file->ha_rnd_end(); if (error) file->print_error(error,MYF(0)); DBUG_RETURN(1); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index ba91b208d03..1bf88de5f5e 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -10085,16 +10085,6 @@ end_temporary: err_new_table_cleanup: my_free(const_cast<uchar*>(frm.str)); - if (new_table) - { - thd->drop_temporary_table(new_table, NULL, true); - } - else - (void) quick_rm_table(thd, new_db_type, - &alter_ctx.new_db, &alter_ctx.tmp_name, - (FN_IS_TMP | (no_ha_table ? NO_HA_TABLE : 0)), - alter_ctx.get_tmp_path()); - /* No default value was provided for a DATE/DATETIME field, the current sql_mode doesn't allow the '0000-00-00' value and @@ -10126,10 +10116,21 @@ err_new_table_cleanup: thd->abort_on_warning= true; make_truncated_value_warning(thd, Sql_condition::WARN_LEVEL_WARN, f_val, strlength(f_val), t_type, + new_table->s, alter_ctx.datetime_field->field_name.str); thd->abort_on_warning= save_abort_on_warning; } + if (new_table) + { + thd->drop_temporary_table(new_table, NULL, true); + } + else + (void) quick_rm_table(thd, new_db_type, + &alter_ctx.new_db, &alter_ctx.tmp_name, + (FN_IS_TMP | (no_ha_table ? NO_HA_TABLE : 0)), + alter_ctx.get_tmp_path()); + DBUG_RETURN(true); err_with_mdl_after_alter: diff --git a/sql/sql_time.cc b/sql/sql_time.cc index 35ef1e50c36..739a95ce9c8 100644 --- a/sql/sql_time.cc +++ b/sql/sql_time.cc @@ -297,7 +297,7 @@ check_date_with_warn(const MYSQL_TIME *ltime, ulonglong fuzzy_date, { ErrConvTime str(ltime); make_truncated_value_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, - &str, ts_type, 0); + &str, ts_type, 0, 0); return true; } return false; @@ -314,7 +314,7 @@ adjust_time_range_with_warn(MYSQL_TIME *ltime, uint dec) return true; if (warnings) make_truncated_value_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, - &str, MYSQL_TIMESTAMP_TIME, NullS); + &str, MYSQL_TIMESTAMP_TIME, 0, NullS); return false; } @@ -403,7 +403,7 @@ str_to_datetime_with_warn(CHARSET_INFO *cs, ret_val ? Sql_condition::WARN_LEVEL_WARN : Sql_condition::time_warn_level(status.warnings), str, length, flags & TIME_TIME_ONLY ? - MYSQL_TIMESTAMP_TIME : l_time->time_type, NullS); + MYSQL_TIMESTAMP_TIME : l_time->time_type, 0, NullS); DBUG_EXECUTE_IF("str_to_datetime_warn", push_warning(thd, Sql_condition::WARN_LEVEL_NOTE, ER_YES, str);); @@ -427,7 +427,7 @@ str_to_datetime_with_warn(CHARSET_INFO *cs, static bool number_to_time_with_warn(bool neg, ulonglong nr, ulong sec_part, MYSQL_TIME *ltime, ulonglong fuzzydate, const ErrConv *str, - const char *field_name) + const TABLE_SHARE *s, const char *field_name) { int was_cut; longlong res; @@ -460,14 +460,15 @@ static bool number_to_time_with_warn(bool neg, ulonglong nr, ulong sec_part, make_truncated_value_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, str, res < 0 ? MYSQL_TIMESTAMP_ERROR : ts_type, - field_name); + s, field_name); } return res < 0; } bool double_to_datetime_with_warn(double value, MYSQL_TIME *ltime, - ulonglong fuzzydate, const char *field_name) + ulonglong fuzzydate, + const TABLE_SHARE *s, const char *field_name) { const ErrConvDouble str(value); bool neg= value < 0; @@ -481,28 +482,30 @@ bool double_to_datetime_with_warn(double value, MYSQL_TIME *ltime, longlong nr= static_cast<ulonglong>(floor(value)); uint sec_part= static_cast<ulong>((value - floor(value))*TIME_SECOND_PART_FACTOR); return number_to_time_with_warn(neg, nr, sec_part, ltime, fuzzydate, &str, - field_name); + s, field_name); } bool decimal_to_datetime_with_warn(const my_decimal *value, MYSQL_TIME *ltime, - ulonglong fuzzydate, const char *field_name) + ulonglong fuzzydate, + const TABLE_SHARE *s, const char *field_name) { const ErrConvDecimal str(value); ulonglong nr; ulong sec_part; bool neg= my_decimal2seconds(value, &nr, &sec_part); return number_to_time_with_warn(neg, nr, sec_part, ltime, fuzzydate, &str, - field_name); + s, field_name); } bool int_to_datetime_with_warn(bool neg, ulonglong value, MYSQL_TIME *ltime, - ulonglong fuzzydate, const char *field_name) + ulonglong fuzzydate, + const TABLE_SHARE *s, const char *field_name) { const ErrConvInteger str(neg ? - (longlong) value : (longlong) value, !neg); return number_to_time_with_warn(neg, value, 0, ltime, - fuzzydate, &str, field_name); + fuzzydate, &str, s, field_name); } @@ -930,7 +933,7 @@ void make_truncated_value_warning(THD *thd, Sql_condition::enum_warning_level level, const ErrConv *sval, timestamp_type time_type, - const char *field_name) + const TABLE_SHARE *s, const char *field_name) { char warn_buff[MYSQL_ERRMSG_SIZE]; const char *type_str; @@ -949,10 +952,21 @@ void make_truncated_value_warning(THD *thd, break; } if (field_name) + { + const char *db_name= s->db.str; + const char *table_name= s->error_table_name(); + + if (!db_name) + db_name= ""; + if (!table_name) + table_name= ""; + cs->cset->snprintf(cs, warn_buff, sizeof(warn_buff), ER_THD(thd, ER_TRUNCATED_WRONG_VALUE_FOR_FIELD), - type_str, sval->ptr(), field_name, + type_str, sval->ptr(), + db_name, table_name, field_name, (ulong) thd->get_stmt_da()->current_row_for_warning()); + } else { if (time_type > MYSQL_TIMESTAMP_ERROR) @@ -1279,7 +1293,7 @@ make_date_with_warn(MYSQL_TIME *ltime, ulonglong fuzzy_date, /* e.g. negative time */ ErrConvTime str(ltime); make_truncated_value_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, - &str, ts_type, 0); + &str, ts_type, 0, 0); return true; } if ((ltime->time_type= ts_type) == MYSQL_TIMESTAMP_DATE) @@ -1443,7 +1457,7 @@ time_to_datetime_with_warn(THD *thd, { ErrConvTime str(from); make_truncated_value_warning(thd, Sql_condition::WARN_LEVEL_WARN, - &str, MYSQL_TIMESTAMP_DATETIME, 0); + &str, MYSQL_TIMESTAMP_DATETIME, 0, 0); return true; } return false; diff --git a/sql/sql_time.h b/sql/sql_time.h index d3607a28a76..ca9f79273ec 100644 --- a/sql/sql_time.h +++ b/sql/sql_time.h @@ -42,13 +42,13 @@ bool str_to_datetime_with_warn(CHARSET_INFO *cs, const char *str, size_t length, ulonglong flags); bool double_to_datetime_with_warn(double value, MYSQL_TIME *ltime, ulonglong fuzzydate, - const char *name); + const TABLE_SHARE *s, const char *name); bool decimal_to_datetime_with_warn(const my_decimal *value, MYSQL_TIME *ltime, ulonglong fuzzydate, - const char *name); + const TABLE_SHARE *s, const char *name); bool int_to_datetime_with_warn(bool neg, ulonglong value, MYSQL_TIME *ltime, ulonglong fuzzydate, - const char *name); + const TABLE_SHARE *s, const char *name); bool time_to_datetime(THD *thd, const MYSQL_TIME *tm, MYSQL_TIME *dt); bool time_to_datetime_with_warn(THD *thd, @@ -118,14 +118,15 @@ void make_truncated_value_warning(THD *thd, Sql_condition::enum_warning_level level, const ErrConv *str_val, timestamp_type time_type, - const char *field_name); + const TABLE_SHARE *s, const char *field_name); static inline void make_truncated_value_warning(THD *thd, - Sql_condition::enum_warning_level level, const char *str_val, size_t str_length, timestamp_type time_type, - const char *field_name) + Sql_condition::enum_warning_level level, const char *str_val, + size_t str_length, timestamp_type time_type, + const TABLE_SHARE *s, const char *field_name) { const ErrConvString str(str_val, str_length, &my_charset_bin); - make_truncated_value_warning(thd, level, &str, time_type, field_name); + make_truncated_value_warning(thd, level, &str, time_type, s, field_name); } extern DATE_TIME_FORMAT *date_time_format_make(timestamp_type format_type, |