mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-34295 CAST(char_col AS DOUBLE) prints redundant spaces in a warning
Field_string::val_int(), Field_string::val_real(), Field_string::val_decimal() passed the whole buffer of field_length bytes to data type conversion routines. This made conversion routines to print redundant trailing spaces in case of warnings. Adding a method Field_string::to_lex_cstring() and using it inside val_int(), val_real(), val_decimal(), val_str(). After this change conversion routines get the same value with what val_str() returns, and no redundant trailing spaces are displayed.
This commit is contained in:
40
sql/field.cc
40
sql/field.cc
@ -7485,11 +7485,11 @@ double Field_string::val_real(void)
|
||||
{
|
||||
DBUG_ASSERT(marked_for_read());
|
||||
THD *thd= get_thd();
|
||||
return Converter_strntod_with_warn(get_thd(),
|
||||
const LEX_CSTRING str= to_lex_cstring();
|
||||
return Converter_strntod_with_warn(thd,
|
||||
Warn_filter_string(thd, this),
|
||||
Field_string::charset(),
|
||||
(const char *) ptr,
|
||||
field_length).result();
|
||||
str.str, str.length).result();
|
||||
}
|
||||
|
||||
|
||||
@ -7497,10 +7497,10 @@ longlong Field_string::val_int(void)
|
||||
{
|
||||
DBUG_ASSERT(marked_for_read());
|
||||
THD *thd= get_thd();
|
||||
const LEX_CSTRING str= to_lex_cstring();
|
||||
return Converter_strntoll_with_warn(thd, Warn_filter_string(thd, this),
|
||||
Field_string::charset(),
|
||||
(const char *) ptr,
|
||||
field_length).result();
|
||||
str.str, str.length).result();
|
||||
}
|
||||
|
||||
|
||||
@ -7516,20 +7516,26 @@ sql_mode_t Field_string::can_handle_sql_mode_dependency_on_store() const
|
||||
}
|
||||
|
||||
|
||||
String *Field_string::val_str(String *val_buffer __attribute__((unused)),
|
||||
String *val_ptr)
|
||||
LEX_CSTRING Field_string::to_lex_cstring() const
|
||||
{
|
||||
DBUG_ASSERT(marked_for_read());
|
||||
/* See the comment for Field_long::store(long long) */
|
||||
DBUG_ASSERT(!table || table->in_use == current_thd);
|
||||
size_t length;
|
||||
if (get_thd()->variables.sql_mode &
|
||||
MODE_PAD_CHAR_TO_FULL_LENGTH)
|
||||
length= field_charset()->charpos(ptr, ptr + field_length,
|
||||
Field_string::char_length());
|
||||
else
|
||||
length= field_charset()->lengthsp((const char*) ptr, field_length);
|
||||
val_ptr->set((const char*) ptr, length, field_charset());
|
||||
if (get_thd()->variables.sql_mode & MODE_PAD_CHAR_TO_FULL_LENGTH)
|
||||
return Lex_cstring((const char*) ptr,
|
||||
field_charset()->charpos(ptr, ptr + field_length,
|
||||
Field_string::char_length()));
|
||||
return Lex_cstring((const char *) ptr,
|
||||
field_charset()->lengthsp((const char*) ptr, field_length));
|
||||
}
|
||||
|
||||
|
||||
String *Field_string::val_str(String *val_buffer __attribute__((unused)),
|
||||
String *val_ptr)
|
||||
{
|
||||
DBUG_ASSERT(marked_for_read());
|
||||
const LEX_CSTRING str= to_lex_cstring();
|
||||
val_ptr->set(str.str, str.length, field_charset());
|
||||
return val_ptr;
|
||||
}
|
||||
|
||||
@ -7538,12 +7544,12 @@ my_decimal *Field_string::val_decimal(my_decimal *decimal_value)
|
||||
{
|
||||
DBUG_ASSERT(marked_for_read());
|
||||
THD *thd= get_thd();
|
||||
const LEX_CSTRING str= to_lex_cstring();
|
||||
Converter_str2my_decimal_with_warn(thd,
|
||||
Warn_filter_string(thd, this),
|
||||
E_DEC_FATAL_ERROR & ~E_DEC_BAD_NUM,
|
||||
Field_string::charset(),
|
||||
(const char *) ptr,
|
||||
field_length, decimal_value);
|
||||
str.str, str.length, decimal_value);
|
||||
return decimal_value;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user