Loading mysql-test/r/cast.result +8 −0 Original line number Diff line number Diff line Loading @@ -344,6 +344,14 @@ select cast(s1 as decimal(7,2)) from t1; cast(s1 as decimal(7,2)) 111111.00 drop table t1; CREATE TABLE t1 (v varchar(10), tt tinytext, t text, mt mediumtext, lt longtext); INSERT INTO t1 VALUES ('1.01', '2.02', '3.03', '4.04', '5.05'); SELECT CAST(v AS DECIMAL), CAST(tt AS DECIMAL), CAST(t AS DECIMAL), CAST(mt AS DECIMAL), CAST(lt AS DECIMAL) from t1; CAST(v AS DECIMAL) CAST(tt AS DECIMAL) CAST(t AS DECIMAL) CAST(mt AS DECIMAL) CAST(lt AS DECIMAL) 1.01 2.02 3.03 4.04 5.05 DROP TABLE t1; select cast(NULL as decimal(6)) as t1; t1 NULL mysql-test/t/cast.test +11 −0 Original line number Diff line number Diff line Loading @@ -170,6 +170,17 @@ select cast(s1 as decimal(7,2)) from t1; drop table t1; # # Test for bug #11283: field conversion from varchar, and text types to decimal # CREATE TABLE t1 (v varchar(10), tt tinytext, t text, mt mediumtext, lt longtext); INSERT INTO t1 VALUES ('1.01', '2.02', '3.03', '4.04', '5.05'); SELECT CAST(v AS DECIMAL), CAST(tt AS DECIMAL), CAST(t AS DECIMAL), CAST(mt AS DECIMAL), CAST(lt AS DECIMAL) from t1; DROP TABLE t1; # Bug @10237 (CAST(NULL DECIMAL) crashes server) # select cast(NULL as decimal(6)) as t1; Loading sql/field.cc +29 −8 Original line number Diff line number Diff line Loading @@ -5956,14 +5956,6 @@ longlong Field_string::val_int(void) } my_decimal *Field_longstr::val_decimal(my_decimal *decimal_value) { str2my_decimal(E_DEC_FATAL_ERROR, ptr, field_length, charset(), decimal_value); return decimal_value; } String *Field_string::val_str(String *val_buffer __attribute__((unused)), String *val_ptr) { Loading @@ -5975,6 +5967,14 @@ String *Field_string::val_str(String *val_buffer __attribute__((unused)), } my_decimal *Field_string::val_decimal(my_decimal *decimal_value) { str2my_decimal(E_DEC_FATAL_ERROR, ptr, field_length, charset(), decimal_value); return decimal_value; } int Field_string::cmp(const char *a_ptr, const char *b_ptr) { uint a_len, b_len; Loading Loading @@ -6288,6 +6288,15 @@ String *Field_varstring::val_str(String *val_buffer __attribute__((unused)), } my_decimal *Field_varstring::val_decimal(my_decimal *decimal_value) { uint length= length_bytes == 1 ? (uint) (uchar) *ptr : uint2korr(ptr); str2my_decimal(E_DEC_FATAL_ERROR, ptr+length_bytes, length, charset(), decimal_value); return decimal_value; } int Field_varstring::cmp(const char *a_ptr, const char *b_ptr) { uint a_length, b_length; Loading Loading @@ -6906,6 +6915,18 @@ String *Field_blob::val_str(String *val_buffer __attribute__((unused)), } my_decimal *Field_blob::val_decimal(my_decimal *decimal_value) { char *blob; memcpy_fixed(&blob, ptr+packlength, sizeof(char*)); if (!blob) blob= ""; str2my_decimal(E_DEC_FATAL_ERROR, blob, get_length(ptr), charset(), decimal_value); return decimal_value; } int Field_blob::cmp(const char *a,uint32 a_length, const char *b, uint32 b_length) { Loading sql/field.h +3 −1 Original line number Diff line number Diff line Loading @@ -381,7 +381,6 @@ class Field_longstr :public Field_str field_name_arg, table_arg, charset) {} my_decimal *val_decimal(my_decimal *); int store_decimal(const my_decimal *d); }; Loading Loading @@ -993,6 +992,7 @@ class Field_string :public Field_longstr { double val_real(void); longlong val_int(void); String *val_str(String*,String *); my_decimal *val_decimal(my_decimal *); int cmp(const char *,const char*); void sort_string(char *buff,uint length); void sql_type(String &str) const; Loading Loading @@ -1051,6 +1051,7 @@ class Field_varstring :public Field_longstr { double val_real(void); longlong val_int(void); String *val_str(String*,String *); my_decimal *val_decimal(my_decimal *); int cmp(const char *,const char*); void sort_string(char *buff,uint length); void get_key_image(char *buff,uint length, imagetype type); Loading Loading @@ -1106,6 +1107,7 @@ class Field_blob :public Field_longstr { double val_real(void); longlong val_int(void); String *val_str(String*,String *); my_decimal *val_decimal(my_decimal *); int cmp(const char *,const char*); int cmp(const char *a, uint32 a_length, const char *b, uint32 b_length); int cmp_binary(const char *a,const char *b, uint32 max_length=~0L); Loading Loading
mysql-test/r/cast.result +8 −0 Original line number Diff line number Diff line Loading @@ -344,6 +344,14 @@ select cast(s1 as decimal(7,2)) from t1; cast(s1 as decimal(7,2)) 111111.00 drop table t1; CREATE TABLE t1 (v varchar(10), tt tinytext, t text, mt mediumtext, lt longtext); INSERT INTO t1 VALUES ('1.01', '2.02', '3.03', '4.04', '5.05'); SELECT CAST(v AS DECIMAL), CAST(tt AS DECIMAL), CAST(t AS DECIMAL), CAST(mt AS DECIMAL), CAST(lt AS DECIMAL) from t1; CAST(v AS DECIMAL) CAST(tt AS DECIMAL) CAST(t AS DECIMAL) CAST(mt AS DECIMAL) CAST(lt AS DECIMAL) 1.01 2.02 3.03 4.04 5.05 DROP TABLE t1; select cast(NULL as decimal(6)) as t1; t1 NULL
mysql-test/t/cast.test +11 −0 Original line number Diff line number Diff line Loading @@ -170,6 +170,17 @@ select cast(s1 as decimal(7,2)) from t1; drop table t1; # # Test for bug #11283: field conversion from varchar, and text types to decimal # CREATE TABLE t1 (v varchar(10), tt tinytext, t text, mt mediumtext, lt longtext); INSERT INTO t1 VALUES ('1.01', '2.02', '3.03', '4.04', '5.05'); SELECT CAST(v AS DECIMAL), CAST(tt AS DECIMAL), CAST(t AS DECIMAL), CAST(mt AS DECIMAL), CAST(lt AS DECIMAL) from t1; DROP TABLE t1; # Bug @10237 (CAST(NULL DECIMAL) crashes server) # select cast(NULL as decimal(6)) as t1; Loading
sql/field.cc +29 −8 Original line number Diff line number Diff line Loading @@ -5956,14 +5956,6 @@ longlong Field_string::val_int(void) } my_decimal *Field_longstr::val_decimal(my_decimal *decimal_value) { str2my_decimal(E_DEC_FATAL_ERROR, ptr, field_length, charset(), decimal_value); return decimal_value; } String *Field_string::val_str(String *val_buffer __attribute__((unused)), String *val_ptr) { Loading @@ -5975,6 +5967,14 @@ String *Field_string::val_str(String *val_buffer __attribute__((unused)), } my_decimal *Field_string::val_decimal(my_decimal *decimal_value) { str2my_decimal(E_DEC_FATAL_ERROR, ptr, field_length, charset(), decimal_value); return decimal_value; } int Field_string::cmp(const char *a_ptr, const char *b_ptr) { uint a_len, b_len; Loading Loading @@ -6288,6 +6288,15 @@ String *Field_varstring::val_str(String *val_buffer __attribute__((unused)), } my_decimal *Field_varstring::val_decimal(my_decimal *decimal_value) { uint length= length_bytes == 1 ? (uint) (uchar) *ptr : uint2korr(ptr); str2my_decimal(E_DEC_FATAL_ERROR, ptr+length_bytes, length, charset(), decimal_value); return decimal_value; } int Field_varstring::cmp(const char *a_ptr, const char *b_ptr) { uint a_length, b_length; Loading Loading @@ -6906,6 +6915,18 @@ String *Field_blob::val_str(String *val_buffer __attribute__((unused)), } my_decimal *Field_blob::val_decimal(my_decimal *decimal_value) { char *blob; memcpy_fixed(&blob, ptr+packlength, sizeof(char*)); if (!blob) blob= ""; str2my_decimal(E_DEC_FATAL_ERROR, blob, get_length(ptr), charset(), decimal_value); return decimal_value; } int Field_blob::cmp(const char *a,uint32 a_length, const char *b, uint32 b_length) { Loading
sql/field.h +3 −1 Original line number Diff line number Diff line Loading @@ -381,7 +381,6 @@ class Field_longstr :public Field_str field_name_arg, table_arg, charset) {} my_decimal *val_decimal(my_decimal *); int store_decimal(const my_decimal *d); }; Loading Loading @@ -993,6 +992,7 @@ class Field_string :public Field_longstr { double val_real(void); longlong val_int(void); String *val_str(String*,String *); my_decimal *val_decimal(my_decimal *); int cmp(const char *,const char*); void sort_string(char *buff,uint length); void sql_type(String &str) const; Loading Loading @@ -1051,6 +1051,7 @@ class Field_varstring :public Field_longstr { double val_real(void); longlong val_int(void); String *val_str(String*,String *); my_decimal *val_decimal(my_decimal *); int cmp(const char *,const char*); void sort_string(char *buff,uint length); void get_key_image(char *buff,uint length, imagetype type); Loading Loading @@ -1106,6 +1107,7 @@ class Field_blob :public Field_longstr { double val_real(void); longlong val_int(void); String *val_str(String*,String *); my_decimal *val_decimal(my_decimal *); int cmp(const char *,const char*); int cmp(const char *a, uint32 a_length, const char *b, uint32 b_length); int cmp_binary(const char *a,const char *b, uint32 max_length=~0L); Loading