auto merge
This commit is contained in:
commit
bdec5458ae
@ -424,3 +424,10 @@ select f1 from t1 group by f1 having max(f1)=f1;
|
|||||||
f1
|
f1
|
||||||
set session sql_mode='';
|
set session sql_mode='';
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
CREATE TABLE t1 ( a INT, b INT);
|
||||||
|
INSERT INTO t1 VALUES (1, 1), (2,2), (3, NULL);
|
||||||
|
SELECT b, COUNT(DISTINCT a) FROM t1 GROUP BY b HAVING b is NULL;
|
||||||
|
b COUNT(DISTINCT a)
|
||||||
|
NULL 1
|
||||||
|
DROP TABLE t1;
|
||||||
|
End of 5.0 tests
|
||||||
|
@ -432,3 +432,14 @@ select f1 from t1 having max(f1)=f1;
|
|||||||
select f1 from t1 group by f1 having max(f1)=f1;
|
select f1 from t1 group by f1 having max(f1)=f1;
|
||||||
set session sql_mode='';
|
set session sql_mode='';
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #38637: COUNT DISTINCT prevents NULL testing in HAVING clause
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 ( a INT, b INT);
|
||||||
|
INSERT INTO t1 VALUES (1, 1), (2,2), (3, NULL);
|
||||||
|
SELECT b, COUNT(DISTINCT a) FROM t1 GROUP BY b HAVING b is NULL;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo End of 5.0 tests
|
||||||
|
19
sql/item.cc
19
sql/item.cc
@ -2041,6 +2041,12 @@ bool Item_field::val_bool_result()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Item_field::is_null_result()
|
||||||
|
{
|
||||||
|
return (null_value=result_field->is_null());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Item_field::eq(const Item *item, bool binary_cmp) const
|
bool Item_field::eq(const Item *item, bool binary_cmp) const
|
||||||
{
|
{
|
||||||
Item *real_item= ((Item *) item)->real_item();
|
Item *real_item= ((Item *) item)->real_item();
|
||||||
@ -5629,6 +5635,15 @@ double Item_ref::val_result()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Item_ref::is_null_result()
|
||||||
|
{
|
||||||
|
if (result_field)
|
||||||
|
return (null_value=result_field->is_null());
|
||||||
|
|
||||||
|
return is_null();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
longlong Item_ref::val_int_result()
|
longlong Item_ref::val_int_result()
|
||||||
{
|
{
|
||||||
if (result_field)
|
if (result_field)
|
||||||
@ -5734,7 +5749,9 @@ String *Item_ref::val_str(String* tmp)
|
|||||||
bool Item_ref::is_null()
|
bool Item_ref::is_null()
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(fixed);
|
DBUG_ASSERT(fixed);
|
||||||
return (*ref)->is_null();
|
bool tmp=(*ref)->is_null_result();
|
||||||
|
null_value=(*ref)->null_value;
|
||||||
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -652,6 +652,7 @@ public:
|
|||||||
virtual my_decimal *val_decimal_result(my_decimal *val)
|
virtual my_decimal *val_decimal_result(my_decimal *val)
|
||||||
{ return val_decimal(val); }
|
{ return val_decimal(val); }
|
||||||
virtual bool val_bool_result() { return val_bool(); }
|
virtual bool val_bool_result() { return val_bool(); }
|
||||||
|
virtual bool is_null_result() { return is_null(); }
|
||||||
|
|
||||||
/* bit map of tables used by item */
|
/* bit map of tables used by item */
|
||||||
virtual table_map used_tables() const { return (table_map) 0L; }
|
virtual table_map used_tables() const { return (table_map) 0L; }
|
||||||
@ -1301,6 +1302,7 @@ public:
|
|||||||
String *str_result(String* tmp);
|
String *str_result(String* tmp);
|
||||||
my_decimal *val_decimal_result(my_decimal *);
|
my_decimal *val_decimal_result(my_decimal *);
|
||||||
bool val_bool_result();
|
bool val_bool_result();
|
||||||
|
bool is_null_result();
|
||||||
bool send(Protocol *protocol, String *str_arg);
|
bool send(Protocol *protocol, String *str_arg);
|
||||||
void reset_field(Field *f);
|
void reset_field(Field *f);
|
||||||
bool fix_fields(THD *, Item **);
|
bool fix_fields(THD *, Item **);
|
||||||
@ -1942,6 +1944,7 @@ public:
|
|||||||
String *str_result(String* tmp);
|
String *str_result(String* tmp);
|
||||||
my_decimal *val_decimal_result(my_decimal *);
|
my_decimal *val_decimal_result(my_decimal *);
|
||||||
bool val_bool_result();
|
bool val_bool_result();
|
||||||
|
bool is_null_result();
|
||||||
bool send(Protocol *prot, String *tmp);
|
bool send(Protocol *prot, String *tmp);
|
||||||
void make_field(Send_field *field);
|
void make_field(Send_field *field);
|
||||||
bool fix_fields(THD *, Item **);
|
bool fix_fields(THD *, Item **);
|
||||||
|
@ -4285,6 +4285,15 @@ my_decimal *Item_func_set_user_var::val_decimal_result(my_decimal *val)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Item_func_set_user_var::is_null_result()
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(fixed == 1);
|
||||||
|
check(TRUE);
|
||||||
|
update(); // Store expression
|
||||||
|
return is_null();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Item_func_set_user_var::print(String *str)
|
void Item_func_set_user_var::print(String *str)
|
||||||
{
|
{
|
||||||
str->append(STRING_WITH_LEN("(@"));
|
str->append(STRING_WITH_LEN("(@"));
|
||||||
|
@ -1302,6 +1302,7 @@ public:
|
|||||||
longlong val_int_result();
|
longlong val_int_result();
|
||||||
String *str_result(String *str);
|
String *str_result(String *str);
|
||||||
my_decimal *val_decimal_result(my_decimal *);
|
my_decimal *val_decimal_result(my_decimal *);
|
||||||
|
bool is_null_result();
|
||||||
bool update_hash(void *ptr, uint length, enum Item_result type,
|
bool update_hash(void *ptr, uint length, enum Item_result type,
|
||||||
CHARSET_INFO *cs, Derivation dv, bool unsigned_arg);
|
CHARSET_INFO *cs, Derivation dv, bool unsigned_arg);
|
||||||
bool send(Protocol *protocol, String *str_arg);
|
bool send(Protocol *protocol, String *str_arg);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user