Commit 7118c252 authored by unknown's avatar unknown

Bug #20466: a view is mixing data when there's a trigger on the table

  When making a place to store field values at the start of each group
  the real item (not the reference) must be used when deciding which column
  to copy.


mysql-test/r/group_by.result:
  Bug #20466: a view is mixing data when there's a trigger on the table
   - test suite for the bug
mysql-test/t/group_by.test:
  Bug #20466: a view is mixing data when there's a trigger on the table
   - test suite for the bug
sql/sql_select.cc:
  Bug #20466: a view is mixing data when there's a trigger on the table
   - deal correctly with references
parent f8dda7bf
...@@ -796,3 +796,28 @@ aaa ...@@ -796,3 +796,28 @@ aaa
show warnings; show warnings;
Level Code Message Level Code Message
drop table t1, t2; drop table t1, t2;
CREATE TABLE t1 (a tinyint(3), b varchar(255), PRIMARY KEY (a));
INSERT INTO t1 VALUES (1,'-----'), (6,'Allemagne'), (17,'Autriche'),
(25,'Belgique'), (54,'Danemark'), (62,'Espagne'), (68,'France');
CREATE TABLE t2 (a tinyint(3), b tinyint(3), PRIMARY KEY (a), KEY b (b));
INSERT INTO t2 VALUES (1,1), (2,1), (6,6), (18,17), (15,25), (16,25),
(17,25), (10,54), (5,62),(3,68);
CREATE VIEW v1 AS select t1.a, concat(t1.b,'') AS b, t1.b as real_b from t1;
explain
SELECT straight_join sql_no_cache v1.a, v1.b, v1.real_b from t2, v1
where t2.b=v1.a GROUP BY t2.b;
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t2 index b b 2 NULL 10 Using index
1 PRIMARY t1 eq_ref PRIMARY PRIMARY 1 test.t2.b 1
SELECT straight_join sql_no_cache v1.a, v1.b, v1.real_b from t2, v1
where t2.b=v1.a GROUP BY t2.b;
a b real_b
1 ----- -----
6 Allemagne Allemagne
17 Autriche Autriche
25 Belgique Belgique
54 Danemark Danemark
62 Espagne Espagne
68 France France
DROP VIEW v1;
DROP TABLE t1,t2;
...@@ -632,3 +632,26 @@ group by t1.c1; ...@@ -632,3 +632,26 @@ group by t1.c1;
show warnings; show warnings;
drop table t1, t2; drop table t1, t2;
#
# Bug #20466: a view is mixing data when there's a trigger on the table
#
CREATE TABLE t1 (a tinyint(3), b varchar(255), PRIMARY KEY (a));
INSERT INTO t1 VALUES (1,'-----'), (6,'Allemagne'), (17,'Autriche'),
(25,'Belgique'), (54,'Danemark'), (62,'Espagne'), (68,'France');
CREATE TABLE t2 (a tinyint(3), b tinyint(3), PRIMARY KEY (a), KEY b (b));
INSERT INTO t2 VALUES (1,1), (2,1), (6,6), (18,17), (15,25), (16,25),
(17,25), (10,54), (5,62),(3,68);
CREATE VIEW v1 AS select t1.a, concat(t1.b,'') AS b, t1.b as real_b from t1;
explain
SELECT straight_join sql_no_cache v1.a, v1.b, v1.real_b from t2, v1
where t2.b=v1.a GROUP BY t2.b;
SELECT straight_join sql_no_cache v1.a, v1.b, v1.real_b from t2, v1
where t2.b=v1.a GROUP BY t2.b;
DROP VIEW v1;
DROP TABLE t1,t2;
...@@ -13066,10 +13066,11 @@ setup_copy_fields(THD *thd, TMP_TABLE_PARAM *param, ...@@ -13066,10 +13066,11 @@ setup_copy_fields(THD *thd, TMP_TABLE_PARAM *param,
param->copy_funcs.empty(); param->copy_funcs.empty();
for (i= 0; (pos= li++); i++) for (i= 0; (pos= li++); i++)
{ {
if (pos->real_item()->type() == Item::FIELD_ITEM) Item *real_pos= pos->real_item();
if (real_pos->type() == Item::FIELD_ITEM)
{ {
Item_field *item; Item_field *item;
pos= pos->real_item(); pos= real_pos;
if (!(item= new Item_field(thd, ((Item_field*) pos)))) if (!(item= new Item_field(thd, ((Item_field*) pos))))
goto err; goto err;
pos= item; pos= item;
...@@ -13108,12 +13109,13 @@ setup_copy_fields(THD *thd, TMP_TABLE_PARAM *param, ...@@ -13108,12 +13109,13 @@ setup_copy_fields(THD *thd, TMP_TABLE_PARAM *param,
} }
} }
} }
else if ((pos->type() == Item::FUNC_ITEM || else if ((real_pos->type() == Item::FUNC_ITEM ||
pos->type() == Item::SUBSELECT_ITEM || real_pos->type() == Item::SUBSELECT_ITEM ||
pos->type() == Item::CACHE_ITEM || real_pos->type() == Item::CACHE_ITEM ||
pos->type() == Item::COND_ITEM) && real_pos->type() == Item::COND_ITEM) &&
!pos->with_sum_func) !real_pos->with_sum_func)
{ // Save for send fields { // Save for send fields
pos= real_pos;
/* TODO: /* TODO:
In most cases this result will be sent to the user. In most cases this result will be sent to the user.
This should be changed to use copy_int or copy_real depending This should be changed to use copy_int or copy_real depending
......
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