Commit 261c22a8 authored by unknown's avatar unknown

fixed bug in subselect value storing


mysql-test/r/subselect.result:
  test for bug in subselect value storing
mysql-test/t/subselect.test:
  test for bug in subselect value storing
parent 16f5d953
...@@ -159,6 +159,9 @@ UNIQUE KEY `email` (`email`) ...@@ -159,6 +159,9 @@ UNIQUE KEY `email` (`email`)
INSERT INTO inscrit (pseudo,email) VALUES ('joce','test'); INSERT INTO inscrit (pseudo,email) VALUES ('joce','test');
INSERT INTO inscrit (pseudo,email) VALUES ('joce1','test1'); INSERT INTO inscrit (pseudo,email) VALUES ('joce1','test1');
INSERT INTO inscrit (pseudo,email) VALUES ('2joce1','2test1'); INSERT INTO inscrit (pseudo,email) VALUES ('2joce1','2test1');
SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo FROM inscrit WHERE pseudo='joce');
pseudo
joce
SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo FROM inscrit WHERE pseudo LIKE '%joce%'); SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo FROM inscrit WHERE pseudo LIKE '%joce%');
Subselect returns more than 1 record Subselect returns more than 1 record
drop table if exists t1,t2,t3,t4,t5,attend,clinic,inscrit; drop table if exists t1,t2,t3,t4,t5,attend,clinic,inscrit;
...@@ -82,6 +82,7 @@ CREATE TABLE `inscrit` ( ...@@ -82,6 +82,7 @@ CREATE TABLE `inscrit` (
INSERT INTO inscrit (pseudo,email) VALUES ('joce','test'); INSERT INTO inscrit (pseudo,email) VALUES ('joce','test');
INSERT INTO inscrit (pseudo,email) VALUES ('joce1','test1'); INSERT INTO inscrit (pseudo,email) VALUES ('joce1','test1');
INSERT INTO inscrit (pseudo,email) VALUES ('2joce1','2test1'); INSERT INTO inscrit (pseudo,email) VALUES ('2joce1','2test1');
SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo FROM inscrit WHERE pseudo='joce');
-- error 1240 -- error 1240
SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo FROM inscrit WHERE pseudo LIKE '%joce%'); SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo FROM inscrit WHERE pseudo LIKE '%joce%');
......
...@@ -150,6 +150,8 @@ String *Item_singleval_subselect::val_str (String *str) ...@@ -150,6 +150,8 @@ String *Item_singleval_subselect::val_str (String *str)
assign_null(); assign_null();
return 0; return 0;
} }
// Assign temporary buffer with stored value
str_value.set(string_value, 0, string_value.length());
return &str_value; return &str_value;
} }
......
...@@ -80,10 +80,16 @@ class Item_subselect :public Item ...@@ -80,10 +80,16 @@ class Item_subselect :public Item
class Item_singleval_subselect :public Item_subselect class Item_singleval_subselect :public Item_subselect
{ {
protected: protected:
longlong int_value; /* here stored integer value of this item */ longlong int_value; /* Here stored integer value of this item */
double real_value; /* here stored real value of this item */ double real_value; /* Here stored real value of this item */
/*
Here stored string value of this item.
(str_value used only as temporary buffer, because it can be changed
by Item::save_field)
*/
String string_value;
enum Item_result res_type; /* type of results */ enum Item_result res_type; /* type of results */
public: public:
Item_singleval_subselect(THD *thd, st_select_lex *select_lex); Item_singleval_subselect(THD *thd, st_select_lex *select_lex);
Item_singleval_subselect(Item_singleval_subselect *item): Item_singleval_subselect(Item_singleval_subselect *item):
...@@ -91,6 +97,7 @@ class Item_singleval_subselect :public Item_subselect ...@@ -91,6 +97,7 @@ class Item_singleval_subselect :public Item_subselect
{ {
int_value= item->int_value; int_value= item->int_value;
real_value= item->real_value; real_value= item->real_value;
string_value.set(item->string_value, 0, item->string_value.length());
max_length= item->max_length; max_length= item->max_length;
decimals= item->decimals; decimals= item->decimals;
res_type= item->res_type; res_type= item->res_type;
......
...@@ -884,9 +884,14 @@ bool select_singleval_subselect::send_data(List<Item> &items) ...@@ -884,9 +884,14 @@ bool select_singleval_subselect::send_data(List<Item> &items)
it->decimals= val_item->decimals; it->decimals= val_item->decimals;
it->binary= val_item->binary; it->binary= val_item->binary;
it->int_value= val_item->val_int(); it->int_value= val_item->val_int();
String *s= val_item->val_str(&it->str_value); String *s= val_item->val_str(&it->string_value);
if (s != &it->str_value) if (s != &it->string_value)
it->str_value.set(*s, 0, s->length()); {
it->string_value.set(*s, 0, s->length());
}
// TODO: remove when correct charset handling appeared for Item
it->str_value.set(*s, 0, s->length()); // store charset
it->res_type= val_item->result_type(); it->res_type= val_item->result_type();
} }
it->assigned(1); it->assigned(1);
......
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