Commit 7118c252 authored by unknown's avatar unknown
Browse files

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
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -796,3 +796,28 @@ aaa
show warnings;
Level	Code	Message
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;
+23 −0
Original line number Diff line number Diff line
@@ -632,3 +632,26 @@ group by t1.c1;
show warnings;
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;
+9 −7
Original line number Diff line number Diff line
@@ -13066,10 +13066,11 @@ setup_copy_fields(THD *thd, TMP_TABLE_PARAM *param,
  param->copy_funcs.empty();
  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;
      pos= pos->real_item();
      pos= real_pos;
      if (!(item= new Item_field(thd, ((Item_field*) pos))))
	goto err;
      pos= item;
@@ -13108,12 +13109,13 @@ setup_copy_fields(THD *thd, TMP_TABLE_PARAM *param,
      }				
      }
    }
    else if ((pos->type() == Item::FUNC_ITEM ||
	      pos->type() == Item::SUBSELECT_ITEM ||
	      pos->type() == Item::CACHE_ITEM ||
	      pos->type() == Item::COND_ITEM) &&
	     !pos->with_sum_func)
    else if ((real_pos->type() == Item::FUNC_ITEM ||
	      real_pos->type() == Item::SUBSELECT_ITEM ||
	      real_pos->type() == Item::CACHE_ITEM ||
	      real_pos->type() == Item::COND_ITEM) &&
	     !real_pos->with_sum_func)
    {						// Save for send fields
      pos= real_pos;
      /* TODO:
	 In most cases this result will be sent to the user.
	 This should be changed to use copy_int or copy_real depending