Commit 4aef2862 authored by unknown's avatar unknown

fixed DISTINCT in subselect bug

small Item_ref fix


mysql-test/r/subselect.result:
  DISTINCT in subselect test
mysql-test/t/subselect.test:
  DISTINCT in subselect test
sql/sql_class.cc:
  fixed DISTINCT in subselect bug
parent efe61a86
......@@ -198,4 +198,10 @@ EXPLAIN SELECT (SELECT DISTINCT date FROM searchconthardwarefr3 WHERE date='2002
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY No tables used
2 SUBSELECT searchconthardwarefr3 index NULL PRIMARY 41 NULL 2 where used; Using index
SELECT DISTINCT date FROM searchconthardwarefr3 WHERE date='2002-08-03';
date
2002-08-03
SELECT (SELECT DISTINCT date FROM searchconthardwarefr3 WHERE date='2002-08-03');
(SELECT DISTINCT date FROM searchconthardwarefr3 WHERE date='2002-08-03')
2002-08-03
drop table searchconthardwarefr3;
......@@ -108,4 +108,6 @@ INSERT INTO searchconthardwarefr3 (topic,date,pseudo) VALUES
('43506','2002-10-02','joce'),('40143','2002-08-03','joce');
EXPLAIN SELECT DISTINCT date FROM searchconthardwarefr3 WHERE date='2002-08-03';
EXPLAIN SELECT (SELECT DISTINCT date FROM searchconthardwarefr3 WHERE date='2002-08-03');
SELECT DISTINCT date FROM searchconthardwarefr3 WHERE date='2002-08-03';
SELECT (SELECT DISTINCT date FROM searchconthardwarefr3 WHERE date='2002-08-03');
drop table searchconthardwarefr3;
\ No newline at end of file
......@@ -71,6 +71,7 @@ class Item {
virtual double val_result() { return val(); }
virtual longlong val_int_result() { return val_int(); }
virtual String *str_result(String* tmp) { return val_str(tmp); }
virtual bool is_null_result() { return is_null(); }
virtual table_map used_tables() const { return (table_map) 0L; }
virtual bool basic_const_item() const { return 0; }
virtual Item *new_item() { return 0; } /* Only for const items */
......@@ -124,6 +125,7 @@ class Item_field :public Item_ident
double val_result();
longlong val_int_result();
String *str_result(String* tmp);
bool is_null_result() { return result_field->is_null(); }
bool send(THD *thd, String *str_arg)
{
return result_field->send(thd,str_arg);
......@@ -398,25 +400,25 @@ class Item_ref :public Item_ident
double val()
{
double tmp=(*ref)->val_result();
null_value=(*ref)->null_value;
null_value=(*ref)->is_null_result();
return tmp;
}
longlong val_int()
{
longlong tmp=(*ref)->val_int_result();
null_value=(*ref)->null_value;
null_value=(*ref)->is_null_result();
return tmp;
}
String *val_str(String* tmp)
{
tmp=(*ref)->str_result(tmp);
null_value=(*ref)->null_value;
null_value=(*ref)->is_null_result();
return tmp;
}
bool is_null()
{
(void) (*ref)->val_int_result();
return (*ref)->null_value;
return (*ref)->is_null_result();
}
bool get_date(TIME *ltime,bool fuzzydate)
{
......
......@@ -873,8 +873,8 @@ bool select_singleval_subselect::send_data(List<Item> &items)
Following val() call have to be first, because function AVG() & STD()
calculate value on it & determinate "is it NULL?".
*/
it->real_value= val_item->val();
if ((it->null_value= val_item->is_null()))
it->real_value= val_item->val_result();
if ((it->null_value= val_item->is_null_result()))
{
it->assign_null();
}
......@@ -883,8 +883,8 @@ bool select_singleval_subselect::send_data(List<Item> &items)
it->max_length= val_item->max_length;
it->decimals= val_item->decimals;
it->binary= val_item->binary;
it->int_value= val_item->val_int();
String *s= val_item->val_str(&it->string_value);
it->int_value= val_item->val_int_result();
String *s= val_item->str_result(&it->string_value);
if (s != &it->string_value)
{
it->string_value.set(*s, 0, s->length());
......
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