Commit ec489073 authored by unknown's avatar unknown

cast.result, cast.test:

  Added test case for bug #11283.
field.h, field.cc:
  Fixed bug #11283: wrong conversion from varchar to decimal.
  Added methods Field_string::val_decimal,
  Field_varstring::val_decimal, Field_blob::val_decimal.
  They are not inherited from the base class Field_longstr
  anymore.


sql/field.cc:
  Fixed bug #11283: wrong conversion from varchar to decimal.
  Added methods Field_string::val_decimal,
  Field_varstring::val_decimal, Field_blob::val_decimal.
  They are not inherited from the base class Field_longstr
  anymore.
sql/field.h:
  Fixed bug #11283: wrong conversion from varchar to decimal.
  Added methods Field_string::val_decimal,
  Field_varstring::val_decimal, Field_blob::val_decimal.
  They are not inherited from the base class Field_longstr
  anymore.
mysql-test/t/cast.test:
  Added test case for bug #11283.
mysql-test/r/cast.result:
  Added test case for bug #11283.
parent 5ad7c3ee
...@@ -344,3 +344,11 @@ select cast(s1 as decimal(7,2)) from t1; ...@@ -344,3 +344,11 @@ select cast(s1 as decimal(7,2)) from t1;
cast(s1 as decimal(7,2)) cast(s1 as decimal(7,2))
111111.00 111111.00
drop table t1; 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;
...@@ -168,3 +168,16 @@ create table t1(s1 time); ...@@ -168,3 +168,16 @@ create table t1(s1 time);
insert into t1 values ('11:11:11'); insert into t1 values ('11:11:11');
select cast(s1 as decimal(7,2)) from t1; select cast(s1 as decimal(7,2)) from t1;
drop table 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;
...@@ -5956,14 +5956,6 @@ longlong Field_string::val_int(void) ...@@ -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 *Field_string::val_str(String *val_buffer __attribute__((unused)),
String *val_ptr) String *val_ptr)
{ {
...@@ -5975,6 +5967,14 @@ String *Field_string::val_str(String *val_buffer __attribute__((unused)), ...@@ -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) int Field_string::cmp(const char *a_ptr, const char *b_ptr)
{ {
uint a_len, b_len; uint a_len, b_len;
...@@ -6288,6 +6288,15 @@ String *Field_varstring::val_str(String *val_buffer __attribute__((unused)), ...@@ -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) int Field_varstring::cmp(const char *a_ptr, const char *b_ptr)
{ {
uint a_length, b_length; uint a_length, b_length;
...@@ -6906,6 +6915,18 @@ String *Field_blob::val_str(String *val_buffer __attribute__((unused)), ...@@ -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, int Field_blob::cmp(const char *a,uint32 a_length, const char *b,
uint32 b_length) uint32 b_length)
{ {
......
...@@ -381,7 +381,6 @@ class Field_longstr :public Field_str ...@@ -381,7 +381,6 @@ class Field_longstr :public Field_str
field_name_arg, table_arg, charset) field_name_arg, table_arg, charset)
{} {}
my_decimal *val_decimal(my_decimal *);
int store_decimal(const my_decimal *d); int store_decimal(const my_decimal *d);
}; };
...@@ -993,6 +992,7 @@ class Field_string :public Field_longstr { ...@@ -993,6 +992,7 @@ class Field_string :public Field_longstr {
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
String *val_str(String*,String *); String *val_str(String*,String *);
my_decimal *val_decimal(my_decimal *);
int cmp(const char *,const char*); int cmp(const char *,const char*);
void sort_string(char *buff,uint length); void sort_string(char *buff,uint length);
void sql_type(String &str) const; void sql_type(String &str) const;
...@@ -1051,6 +1051,7 @@ class Field_varstring :public Field_longstr { ...@@ -1051,6 +1051,7 @@ class Field_varstring :public Field_longstr {
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
String *val_str(String*,String *); String *val_str(String*,String *);
my_decimal *val_decimal(my_decimal *);
int cmp(const char *,const char*); int cmp(const char *,const char*);
void sort_string(char *buff,uint length); void sort_string(char *buff,uint length);
void get_key_image(char *buff,uint length, imagetype type); void get_key_image(char *buff,uint length, imagetype type);
...@@ -1106,6 +1107,7 @@ class Field_blob :public Field_longstr { ...@@ -1106,6 +1107,7 @@ class Field_blob :public Field_longstr {
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
String *val_str(String*,String *); String *val_str(String*,String *);
my_decimal *val_decimal(my_decimal *);
int cmp(const char *,const char*); int cmp(const char *,const char*);
int cmp(const char *a, uint32 a_length, const char *b, uint32 b_length); 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); int cmp_binary(const char *a,const char *b, uint32 max_length=~0L);
......
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