Commit bce65bf4 authored by unknown's avatar unknown

Merge gkodinov@bk-internal.mysql.com:/home/bk/mysql-5.0-opt

into  rakia.gmz:/home/kgeorge/mysql/autopush/B11927-5.0-opt


mysql-test/r/func_gconcat.result:
  Auto merged
sql/field.cc:
  Auto merged
sql/item.cc:
  Auto merged
sql/item.h:
  Auto merged
sql/item_func.h:
  Auto merged
sql/item_subselect.h:
  Auto merged
sql/item_sum.cc:
  Auto merged
sql/item_sum.h:
  Auto merged
sql/sql_string.h:
  Auto merged
parents c0f63d85 9221a548
...@@ -46,6 +46,10 @@ create table t1 (a tinyint(1),b binary(1)); ...@@ -46,6 +46,10 @@ create table t1 (a tinyint(1),b binary(1));
insert into t1 values (0x01,0x01); insert into t1 values (0x01,0x01);
select * from t1 where a=b; select * from t1 where a=b;
a b a b
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: ''
select * from t1 where a=b and b=0x01; select * from t1 where a=b and b=0x01;
a b a b
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: ''
drop table if exists t1; drop table if exists t1;
...@@ -64,11 +64,49 @@ grp group_concat(a order by a,d+c-ascii(c)-a) ...@@ -64,11 +64,49 @@ grp group_concat(a order by a,d+c-ascii(c)-a)
1 1 1 1
2 2,3 2 2,3
3 4,5,6,7,8,9 3 4,5,6,7,8,9
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: 'a '
Warning 1292 Truncated incorrect DOUBLE value: 'a '
Warning 1292 Truncated incorrect DOUBLE value: 'a '
Warning 1292 Truncated incorrect DOUBLE value: 'b '
Warning 1292 Truncated incorrect DOUBLE value: 'b '
Warning 1292 Truncated incorrect DOUBLE value: 'c '
Warning 1292 Truncated incorrect DOUBLE value: 'a '
Warning 1292 Truncated incorrect DOUBLE value: 'E '
Warning 1292 Truncated incorrect DOUBLE value: 'b '
Warning 1292 Truncated incorrect DOUBLE value: 'C '
Warning 1292 Truncated incorrect DOUBLE value: 'b '
Warning 1292 Truncated incorrect DOUBLE value: 'D '
Warning 1292 Truncated incorrect DOUBLE value: 'd '
Warning 1292 Truncated incorrect DOUBLE value: 'd '
Warning 1292 Truncated incorrect DOUBLE value: 'd '
Warning 1292 Truncated incorrect DOUBLE value: 'd '
Warning 1292 Truncated incorrect DOUBLE value: 'c '
Warning 1292 Truncated incorrect DOUBLE value: 'D '
select grp,group_concat(a order by d+c-ascii(c),a) from t1 group by grp; select grp,group_concat(a order by d+c-ascii(c),a) from t1 group by grp;
grp group_concat(a order by d+c-ascii(c),a) grp group_concat(a order by d+c-ascii(c),a)
1 1 1 1
2 3,2 2 3,2
3 7,8,4,6,9,5 3 7,8,4,6,9,5
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: 'a '
Warning 1292 Truncated incorrect DOUBLE value: 'a '
Warning 1292 Truncated incorrect DOUBLE value: 'a '
Warning 1292 Truncated incorrect DOUBLE value: 'b '
Warning 1292 Truncated incorrect DOUBLE value: 'b '
Warning 1292 Truncated incorrect DOUBLE value: 'c '
Warning 1292 Truncated incorrect DOUBLE value: 'a '
Warning 1292 Truncated incorrect DOUBLE value: 'E '
Warning 1292 Truncated incorrect DOUBLE value: 'b '
Warning 1292 Truncated incorrect DOUBLE value: 'C '
Warning 1292 Truncated incorrect DOUBLE value: 'b '
Warning 1292 Truncated incorrect DOUBLE value: 'D '
Warning 1292 Truncated incorrect DOUBLE value: 'd '
Warning 1292 Truncated incorrect DOUBLE value: 'd '
Warning 1292 Truncated incorrect DOUBLE value: 'd '
Warning 1292 Truncated incorrect DOUBLE value: 'd '
Warning 1292 Truncated incorrect DOUBLE value: 'c '
Warning 1292 Truncated incorrect DOUBLE value: 'D '
select grp,group_concat(c order by 1) from t1 group by grp; select grp,group_concat(c order by 1) from t1 group by grp;
grp group_concat(c order by 1) grp group_concat(c order by 1)
1 a 1 a
......
...@@ -62,6 +62,13 @@ NULL NULL ...@@ -62,6 +62,13 @@ NULL NULL
1 7 1 7
2 20.25 2 20.25
3 45.483163247594 3 45.483163247594
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: 'a '
Warning 1292 Truncated incorrect DOUBLE value: 'a '
Warning 1292 Truncated incorrect DOUBLE value: 'b '
Warning 1292 Truncated incorrect DOUBLE value: 'c '
Warning 1292 Truncated incorrect DOUBLE value: 'C '
Warning 1292 Truncated incorrect DOUBLE value: 'E '
create table t2 (grp int, a bigint unsigned, c char(10)); create table t2 (grp int, a bigint unsigned, c char(10));
insert into t2 select grp,max(a)+max(grp),max(c) from t1 group by grp; insert into t2 select grp,max(a)+max(grp),max(c) from t1 group by grp;
replace into t2 select grp, a, c from t1 limit 2,1; replace into t2 select grp, a, c from t1 limit 2,1;
......
...@@ -453,3 +453,38 @@ id name_id id en cz ...@@ -453,3 +453,38 @@ id name_id id en cz
2 3 2 en string 2 cz string 2 2 3 2 en string 2 cz string 2
3 3 3 en string 3 cz string 3 3 3 3 en string 3 cz string 3
drop table t1, t2, t3; drop table t1, t2, t3;
CREATE TABLE t1 (a CHAR(2));
INSERT INTO t1 VALUES (10), (50), (30), ('1a'), (60), ('t');
SELECT a,(a + 0) FROM t1 ORDER BY a;
a (a + 0)
10 10
1a 1
30 30
50 50
60 60
t 0
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: '1a'
Warning 1292 Truncated incorrect DOUBLE value: 't '
SELECT a,(a DIV 2) FROM t1 ORDER BY a;
a (a DIV 2)
10 5
1a 0
30 15
50 25
60 30
t 0
Warnings:
Warning 1292 Truncated incorrect INTEGER value: '1a'
Warning 1292 Truncated incorrect INTEGER value: 't '
SELECT a,CAST(a AS SIGNED) FROM t1 ORDER BY a;
a CAST(a AS SIGNED)
10 10
1a 1
30 30
50 50
60 60
t 0
Warnings:
Warning 1292 Truncated incorrect INTEGER value: '1a'
Warning 1292 Truncated incorrect INTEGER value: 't'
...@@ -187,3 +187,12 @@ left join t3 on t1.id=t3.id order by t3.id; ...@@ -187,3 +187,12 @@ left join t3 on t1.id=t3.id order by t3.id;
--disable_metadata --disable_metadata
--enable_ps_protocol --enable_ps_protocol
drop table t1, t2, t3; drop table t1, t2, t3;
#
# Bug #11927: Warnings shown for CAST( chr as signed) but not (chr + 0)
#
CREATE TABLE t1 (a CHAR(2));
INSERT INTO t1 VALUES (10), (50), (30), ('1a'), (60), ('t');
SELECT a,(a + 0) FROM t1 ORDER BY a;
SELECT a,(a DIV 2) FROM t1 ORDER BY a;
SELECT a,CAST(a AS SIGNED) FROM t1 ORDER BY a;
...@@ -47,6 +47,8 @@ uchar Field_null::null[1]={1}; ...@@ -47,6 +47,8 @@ uchar Field_null::null[1]={1};
const char field_separator=','; const char field_separator=',';
#define DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE 320 #define DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE 320
#define LONGLONG_TO_STRING_CONVERSION_BUFFER_SIZE 128
#define DECIMAL_TO_STRING_CONVERSION_BUFFER_SIZE 128
#define BLOB_PACK_LENGTH_TO_MAX_LENGH(arg) \ #define BLOB_PACK_LENGTH_TO_MAX_LENGH(arg) \
((ulong) ((LL(1) << min(arg, 4) * 8) - LL(1))) ((ulong) ((LL(1) << min(arg, 4) * 8) - LL(1)))
...@@ -6056,19 +6058,49 @@ int Field_longstr::store_decimal(const my_decimal *d) ...@@ -6056,19 +6058,49 @@ int Field_longstr::store_decimal(const my_decimal *d)
double Field_string::val_real(void) double Field_string::val_real(void)
{ {
int not_used; int error;
char *end_not_used; char *end;
CHARSET_INFO *cs= charset(); CHARSET_INFO *cs= charset();
return my_strntod(cs,ptr,field_length,&end_not_used,&not_used); double result;
result= my_strntod(cs,ptr,field_length,&end,&error);
if (!table->in_use->no_errors &&
(error || (field_length != (uint32)(end - ptr) &&
!check_if_only_end_space(cs, end, ptr + field_length))))
{
char buf[DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE];
String tmp(buf, sizeof(buf), cs);
tmp.copy(ptr, field_length, cs);
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
ER_TRUNCATED_WRONG_VALUE,
ER(ER_TRUNCATED_WRONG_VALUE),
"DOUBLE", tmp.c_ptr());
}
return result;
} }
longlong Field_string::val_int(void) longlong Field_string::val_int(void)
{ {
int not_used; int error;
char *end_not_used; char *end;
CHARSET_INFO *cs=charset(); CHARSET_INFO *cs= charset();
return my_strntoll(cs,ptr,field_length,10,&end_not_used,&not_used); longlong result;
result= my_strntoll(cs,ptr,field_length,10,&end,&error);
if (!table->in_use->no_errors &&
(error || (field_length != (uint32)(end - ptr) &&
!check_if_only_end_space(cs, end, ptr + field_length))))
{
char buf[LONGLONG_TO_STRING_CONVERSION_BUFFER_SIZE];
String tmp(buf, sizeof(buf), cs);
tmp.copy(ptr, field_length, cs);
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
ER_TRUNCATED_WRONG_VALUE,
ER(ER_TRUNCATED_WRONG_VALUE),
"INTEGER", tmp.c_ptr());
}
return result;
} }
...@@ -6085,8 +6117,20 @@ String *Field_string::val_str(String *val_buffer __attribute__((unused)), ...@@ -6085,8 +6117,20 @@ String *Field_string::val_str(String *val_buffer __attribute__((unused)),
my_decimal *Field_string::val_decimal(my_decimal *decimal_value) my_decimal *Field_string::val_decimal(my_decimal *decimal_value)
{ {
str2my_decimal(E_DEC_FATAL_ERROR, ptr, field_length, charset(), int err= str2my_decimal(E_DEC_FATAL_ERROR, ptr, field_length, charset(),
decimal_value); decimal_value);
if (!table->in_use->no_errors && err)
{
char buf[DECIMAL_TO_STRING_CONVERSION_BUFFER_SIZE];
CHARSET_INFO *cs= charset();
String tmp(buf, sizeof(buf), cs);
tmp.copy(ptr, field_length, cs);
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
ER_TRUNCATED_WRONG_VALUE,
ER(ER_TRUNCATED_WRONG_VALUE),
"DECIMAL", tmp.c_ptr());
}
return decimal_value; return decimal_value;
} }
......
...@@ -2175,12 +2175,6 @@ void Item_string::print(String *str) ...@@ -2175,12 +2175,6 @@ void Item_string::print(String *str)
} }
inline bool check_if_only_end_space(CHARSET_INFO *cs, char *str, char *end)
{
return str+ cs->cset->scan(cs, str, end, MY_SEQ_SPACES) == end;
}
double Item_string::val_real() double Item_string::val_real()
{ {
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
...@@ -4764,6 +4758,22 @@ bool Item_field::send(Protocol *protocol, String *buffer) ...@@ -4764,6 +4758,22 @@ bool Item_field::send(Protocol *protocol, String *buffer)
} }
void Item_field::update_null_value()
{
/*
need to set no_errors to prevent warnings about type conversion
popping up.
*/
THD *thd= field->table->in_use;
int no_errors;
no_errors= thd->no_errors;
thd->no_errors= 1;
Item::update_null_value();
thd->no_errors= no_errors;
}
Item_ref::Item_ref(Name_resolution_context *context_arg, Item_ref::Item_ref(Name_resolution_context *context_arg,
Item **item, const char *table_name_arg, Item **item, const char *table_name_arg,
const char *field_name_arg) const char *field_name_arg)
...@@ -6120,7 +6130,7 @@ bool Item_cache_row::null_inside() ...@@ -6120,7 +6130,7 @@ bool Item_cache_row::null_inside()
} }
else else
{ {
values[i]->val_int(); values[i]->update_null_value();
if (values[i]->null_value) if (values[i]->null_value)
return 1; return 1;
} }
......
...@@ -703,6 +703,11 @@ class Item { ...@@ -703,6 +703,11 @@ class Item {
*/ */
virtual bool is_null() { return 0; } virtual bool is_null() { return 0; }
/*
Make sure the null_value member has a correct value.
*/
virtual void update_null_value () { (void) val_int(); }
/* /*
Inform the item that there will be no distinction between its result Inform the item that there will be no distinction between its result
being FALSE or NULL. being FALSE or NULL.
...@@ -1270,6 +1275,7 @@ class Item_field :public Item_ident ...@@ -1270,6 +1275,7 @@ class Item_field :public Item_ident
bool get_date_result(TIME *ltime,uint fuzzydate); bool get_date_result(TIME *ltime,uint fuzzydate);
bool get_time(TIME *ltime); bool get_time(TIME *ltime);
bool is_null() { return field->is_null(); } bool is_null() { return field->is_null(); }
void update_null_value();
Item *get_tmp_table_item(THD *thd); Item *get_tmp_table_item(THD *thd);
bool collect_item_field_processor(byte * arg); bool collect_item_field_processor(byte * arg);
bool find_item_in_field_list_processor(byte *arg); bool find_item_in_field_list_processor(byte *arg);
......
...@@ -157,7 +157,7 @@ class Item_func :public Item_result_field ...@@ -157,7 +157,7 @@ class Item_func :public Item_result_field
return (null_value=args[0]->get_time(ltime)); return (null_value=args[0]->get_time(ltime));
} }
bool is_null() { bool is_null() {
(void) val_int(); /* Discard result. It sets null_value as side-effect. */ update_null_value();
return null_value; return null_value;
} }
void signal_divide_by_null(); void signal_divide_by_null();
...@@ -241,7 +241,7 @@ class Item_func_numhybrid: public Item_func ...@@ -241,7 +241,7 @@ class Item_func_numhybrid: public Item_func
virtual double real_op()= 0; virtual double real_op()= 0;
virtual my_decimal *decimal_op(my_decimal *)= 0; virtual my_decimal *decimal_op(my_decimal *)= 0;
virtual String *str_op(String *)= 0; virtual String *str_op(String *)= 0;
bool is_null() { (void) val_real(); return null_value; } bool is_null() { update_null_value(); return null_value; }
}; };
/* function where type of result detected by first argument */ /* function where type of result detected by first argument */
......
...@@ -91,7 +91,7 @@ class Item_subselect :public Item_result_field ...@@ -91,7 +91,7 @@ class Item_subselect :public Item_result_field
enum Type type() const; enum Type type() const;
bool is_null() bool is_null()
{ {
val_int(); update_null_value();
return null_value; return null_value;
} }
bool fix_fields(THD *thd, Item **ref); bool fix_fields(THD *thd, Item **ref);
......
...@@ -1050,7 +1050,7 @@ bool Item_sum_count::add() ...@@ -1050,7 +1050,7 @@ bool Item_sum_count::add()
count++; count++;
else else
{ {
(void) args[0]->val_int(); args[0]->update_null_value();
if (!args[0]->null_value) if (!args[0]->null_value)
count++; count++;
} }
...@@ -1957,7 +1957,7 @@ void Item_sum_count::reset_field() ...@@ -1957,7 +1957,7 @@ void Item_sum_count::reset_field()
nr=1; nr=1;
else else
{ {
(void) args[0]->val_int(); args[0]->update_null_value();
if (!args[0]->null_value) if (!args[0]->null_value)
nr=1; nr=1;
} }
...@@ -2067,7 +2067,7 @@ void Item_sum_count::update_field() ...@@ -2067,7 +2067,7 @@ void Item_sum_count::update_field()
nr++; nr++;
else else
{ {
(void) args[0]->val_int(); args[0]->update_null_value();
if (!args[0]->null_value) if (!args[0]->null_value)
nr++; nr++;
} }
...@@ -2547,7 +2547,7 @@ bool Item_sum_count_distinct::setup(THD *thd) ...@@ -2547,7 +2547,7 @@ bool Item_sum_count_distinct::setup(THD *thd)
return TRUE; // End of memory return TRUE; // End of memory
if (item->const_item()) if (item->const_item())
{ {
(void) item->val_int(); item->update_null_value();
if (item->null_value) if (item->null_value)
always_null=1; always_null=1;
} }
......
...@@ -618,7 +618,7 @@ class Item_avg_field :public Item_result_field ...@@ -618,7 +618,7 @@ class Item_avg_field :public Item_result_field
double val_real(); double val_real();
longlong val_int(); longlong val_int();
my_decimal *val_decimal(my_decimal *); my_decimal *val_decimal(my_decimal *);
bool is_null() { (void) val_int(); return null_value; } bool is_null() { update_null_value(); return null_value; }
String *val_str(String*); String *val_str(String*);
enum_field_types field_type() const enum_field_types field_type() const
{ {
...@@ -685,7 +685,7 @@ class Item_variance_field :public Item_result_field ...@@ -685,7 +685,7 @@ class Item_variance_field :public Item_result_field
{ /* can't be fix_fields()ed */ return (longlong) rint(val_real()); } { /* can't be fix_fields()ed */ return (longlong) rint(val_real()); }
String *val_str(String*); String *val_str(String*);
my_decimal *val_decimal(my_decimal *); my_decimal *val_decimal(my_decimal *);
bool is_null() { (void) val_int(); return null_value; } bool is_null() { update_null_value(); return null_value; }
enum_field_types field_type() const enum_field_types field_type() const
{ {
return hybrid_type == DECIMAL_RESULT ? return hybrid_type == DECIMAL_RESULT ?
......
...@@ -363,3 +363,9 @@ class String ...@@ -363,3 +363,9 @@ class String
return (s->alloced && Ptr >= s->Ptr && Ptr < s->Ptr + s->str_length); return (s->alloced && Ptr >= s->Ptr && Ptr < s->Ptr + s->str_length);
} }
}; };
static inline bool check_if_only_end_space(CHARSET_INFO *cs, char *str,
char *end)
{
return str+ cs->cset->scan(cs, str, end, MY_SEQ_SPACES) == end;
}
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