mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 02:46:29 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			10148 lines
		
	
	
	
		
			219 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			10148 lines
		
	
	
	
		
			219 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| set @save_default_engine=@@default_storage_engine;
 | |
| #######################################
 | |
| #                                     #
 | |
| #            Engine InnoDB            #
 | |
| #                                     #
 | |
| #######################################
 | |
| set global innodb_stats_persistent=1;
 | |
| set default_storage_engine=InnoDB;
 | |
| create table t1 (old_c1 integer,
 | |
| old_c2 integer,
 | |
| c1 integer,
 | |
| c2 integer,
 | |
| c3 integer);
 | |
| create view v1 as select * from t1 where c2=2;
 | |
| create trigger trg_t1 before update on t1 for each row
 | |
| begin
 | |
| set new.old_c1=old.c1;
 | |
| set new.old_c2=old.c2;
 | |
| end;
 | |
| /
 | |
| insert into t1(c1,c2,c3)
 | |
| values (1,1,1), (1,2,2), (1,3,3),
 | |
| (2,1,4), (2,2,5), (2,3,6),
 | |
| (2,4,7), (2,5,8);
 | |
| insert into t1 select NULL, NULL, c1+10,c2,c3+10 from t1;
 | |
| insert into t1 select NULL, NULL, c1+20,c2+1,c3+20 from t1;
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| create table tmp as select * from t1;
 | |
| #######################################
 | |
| #        Test without any index       #
 | |
| #######################################
 | |
| #
 | |
| # Update with value from subquery on the same table
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->5	5	*
 | |
| 2->6	6	*
 | |
| 2->7	7	*
 | |
| 2->8	8	*
 | |
| 11->11	11	 
 | |
| 11->12	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->15	15	*
 | |
| 12->16	16	*
 | |
| 12->17	17	*
 | |
| 12->18	18	*
 | |
| 21->21	21	 
 | |
| 21->22	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->25	25	*
 | |
| 22->26	26	*
 | |
| 22->27	27	*
 | |
| 22->28	28	*
 | |
| 31->31	31	 
 | |
| 31->32	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->35	35	*
 | |
| 32->36	36	*
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + possibly sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1)
 | |
| update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| affected rows: 3
 | |
| info: Rows matched: 3  Changed: 3  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->10	1	*
 | |
| 1->10	2	*
 | |
| 1->10	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + non-sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; Using filesort
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; Using filesort
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a reference to view in subquery
 | |
| # in settable value
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->3	1	*
 | |
| 1->3	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->4	5	*
 | |
| 2->4	6	*
 | |
| 2->4	7	*
 | |
| 2->4	8	*
 | |
| 11->13	11	*
 | |
| 11->13	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->14	15	*
 | |
| 12->14	16	*
 | |
| 12->14	17	*
 | |
| 12->14	18	*
 | |
| 21->23	21	*
 | |
| 21->23	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->24	25	*
 | |
| 22->24	26	*
 | |
| 22->24	27	*
 | |
| 22->24	28	*
 | |
| 31->33	31	*
 | |
| 31->33	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->34	35	*
 | |
| 32->34	36	*
 | |
| 32->34	37	*
 | |
| 32->34	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| explain update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| affected rows: 7
 | |
| info: Rows matched: 7  Changed: 7  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->17	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| 11->24	12	*
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| 12->27	15	*
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| 21->35	21	*
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| 22->38	24	*
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| 31->45	31	*
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| 32->48	34	*
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| affected rows: 1
 | |
| info: Rows matched: 1  Changed: 1  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with EXISTS and reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1 where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 3	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->11	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->12	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with IN predicand over the updated table in WHERE
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1)
 | |
| update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select c3 from t1;
 | |
| c3
 | |
| 111
 | |
| 112
 | |
| 113
 | |
| 114
 | |
| 115
 | |
| 116
 | |
| 117
 | |
| 118
 | |
| 121
 | |
| 122
 | |
| 123
 | |
| 124
 | |
| 125
 | |
| 126
 | |
| 127
 | |
| 128
 | |
| 131
 | |
| 132
 | |
| 133
 | |
| 134
 | |
| 135
 | |
| 136
 | |
| 137
 | |
| 138
 | |
| 141
 | |
| 142
 | |
| 143
 | |
| 144
 | |
| 145
 | |
| 146
 | |
| 147
 | |
| 148
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit and an order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	Using filesort
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using filesort
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #######################################
 | |
| #          Test with an index         #
 | |
| #######################################
 | |
| create index t1_c2 on t1 (c2,c1);
 | |
| analyze table t1;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| #
 | |
| # Update with value from subquery on the same table
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->5	5	*
 | |
| 2->6	6	*
 | |
| 2->7	7	*
 | |
| 2->8	8	*
 | |
| 11->11	11	 
 | |
| 11->12	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->15	15	*
 | |
| 12->16	16	*
 | |
| 12->17	17	*
 | |
| 12->18	18	*
 | |
| 21->21	21	 
 | |
| 21->22	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->25	25	*
 | |
| 22->26	26	*
 | |
| 22->27	27	*
 | |
| 22->28	28	*
 | |
| 31->31	31	 
 | |
| 31->32	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->35	35	*
 | |
| 32->36	36	*
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + possibly sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	index	NULL	t1_c2	10	NULL	32	Using where; Using index; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	index	NULL	t1_c2	10	NULL	32	Using where; Using index; FirstMatch(t1)
 | |
| update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| affected rows: 3
 | |
| info: Rows matched: 3  Changed: 3  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->10	1	*
 | |
| 1->10	2	*
 | |
| 1->10	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + non-sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ref	t1_c2	t1_c2	5	test.t1.c2	5	Using index; FirstMatch(t1)
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ref	t1_c2	t1_c2	5	test.t1.c2	5	Using index; FirstMatch(t1)
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where; Using filesort
 | |
| 1	PRIMARY	a	ref	t1_c2	t1_c2	5	test.t1.c2	5	Using index; FirstMatch(t1)
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where; Using filesort
 | |
| 1	PRIMARY	a	ref	t1_c2	t1_c2	5	test.t1.c2	5	Using index; FirstMatch(t1)
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a reference to view in subquery
 | |
| # in settable value
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	t1	ref	t1_c2	t1_c2	10	const,test.t1.c1	1	Using index
 | |
| update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->3	1	*
 | |
| 1->3	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->4	5	*
 | |
| 2->4	6	*
 | |
| 2->4	7	*
 | |
| 2->4	8	*
 | |
| 11->13	11	*
 | |
| 11->13	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->14	15	*
 | |
| 12->14	16	*
 | |
| 12->14	17	*
 | |
| 12->14	18	*
 | |
| 21->23	21	*
 | |
| 21->23	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->24	25	*
 | |
| 22->24	26	*
 | |
| 22->24	27	*
 | |
| 22->24	28	*
 | |
| 31->33	31	*
 | |
| 31->33	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->34	35	*
 | |
| 32->34	36	*
 | |
| 32->34	37	*
 | |
| 32->34	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ref	t1_c2	t1_c2	5	const	8	
 | |
| explain update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ref	t1_c2	t1_c2	5	const	8	Using where
 | |
| 2	DEPENDENT SUBQUERY	a	index	NULL	t1_c2	10	NULL	32	Using where; Using index
 | |
| update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| affected rows: 7
 | |
| info: Rows matched: 7  Changed: 7  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->17	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| 11->24	12	*
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| 12->27	15	*
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| 21->35	21	*
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| 22->38	24	*
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| 31->45	31	*
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| 32->48	34	*
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	range	t1_c2	t1_c2	10	NULL	1	Using index condition
 | |
| 1	PRIMARY	t1	ref	t1_c2	t1_c2	10	const,test.t1.c1	1	Using index; FirstMatch(t1)
 | |
| explain update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	range	t1_c2	t1_c2	10	NULL	1	Using index condition; Using where
 | |
| 2	DEPENDENT SUBQUERY	t1	ref	t1_c2	t1_c2	10	const,func	1	Using where; Using index
 | |
| update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| affected rows: 1
 | |
| info: Rows matched: 1  Changed: 1  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with EXISTS and reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1 where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	range	t1_c2	t1_c2	10	NULL	2	Using index condition
 | |
| 1	PRIMARY	t1	ref	t1_c2	t1_c2	5	const	8	Using index; FirstMatch(t1)
 | |
| explain update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	range	t1_c2	t1_c2	10	NULL	2	Using index condition
 | |
| 3	DEPENDENT SUBQUERY	t1	ref	t1_c2	t1_c2	5	const	8	Using where; Using index
 | |
| 2	DEPENDENT SUBQUERY	t1	ref	t1_c2	t1_c2	10	const,test.t1.c1	1	Using index
 | |
| update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->11	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->12	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with IN predicand over the updated table in WHERE
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ref	t1_c2	t1_c2	10	test.t1.c2,test.t1.c1	1	Using index; FirstMatch(t1)
 | |
| explain update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ref	t1_c2	t1_c2	10	test.t1.c2,test.t1.c1	1	Using index; FirstMatch(t1)
 | |
| update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select c3 from t1;
 | |
| c3
 | |
| 111
 | |
| 112
 | |
| 113
 | |
| 114
 | |
| 115
 | |
| 116
 | |
| 117
 | |
| 118
 | |
| 121
 | |
| 122
 | |
| 123
 | |
| 124
 | |
| 125
 | |
| 126
 | |
| 127
 | |
| 128
 | |
| 131
 | |
| 132
 | |
| 133
 | |
| 134
 | |
| 135
 | |
| 136
 | |
| 137
 | |
| 138
 | |
| 141
 | |
| 142
 | |
| 143
 | |
| 144
 | |
| 145
 | |
| 146
 | |
| 147
 | |
| 148
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit and an order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	Using filesort
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using filesort
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #######################################
 | |
| #       Test with a primary key       #
 | |
| #######################################
 | |
| drop index t1_c2 on t1;
 | |
| alter table t1 add primary key (c3);
 | |
| analyze table t1;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| #
 | |
| # Update with value from subquery on the same table
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	eq_ref	PRIMARY	PRIMARY	4	test.t1.c3	1	
 | |
| update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->5	5	*
 | |
| 2->6	6	*
 | |
| 2->7	7	*
 | |
| 2->8	8	*
 | |
| 11->11	11	 
 | |
| 11->12	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->15	15	*
 | |
| 12->16	16	*
 | |
| 12->17	17	*
 | |
| 12->18	18	*
 | |
| 21->21	21	 
 | |
| 21->22	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->25	25	*
 | |
| 22->26	26	*
 | |
| 22->27	27	*
 | |
| 22->28	28	*
 | |
| 31->31	31	 
 | |
| 31->32	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->35	35	*
 | |
| 32->36	36	*
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + possibly sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1)
 | |
| update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| affected rows: 3
 | |
| info: Rows matched: 3  Changed: 3  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->10	1	*
 | |
| 1->10	2	*
 | |
| 1->10	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + non-sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; Using filesort
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; Using filesort
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a reference to view in subquery
 | |
| # in settable value
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->3	1	*
 | |
| 1->3	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->4	5	*
 | |
| 2->4	6	*
 | |
| 2->4	7	*
 | |
| 2->4	8	*
 | |
| 11->13	11	*
 | |
| 11->13	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->14	15	*
 | |
| 12->14	16	*
 | |
| 12->14	17	*
 | |
| 12->14	18	*
 | |
| 21->23	21	*
 | |
| 21->23	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->24	25	*
 | |
| 22->24	26	*
 | |
| 22->24	27	*
 | |
| 22->24	28	*
 | |
| 31->33	31	*
 | |
| 31->33	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->34	35	*
 | |
| 32->34	36	*
 | |
| 32->34	37	*
 | |
| 32->34	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| explain update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	range	PRIMARY	PRIMARY	4	NULL	29	Using where
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| affected rows: 7
 | |
| info: Rows matched: 7  Changed: 7  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->17	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| 11->24	12	*
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| 12->27	15	*
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| 21->35	21	*
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| 22->38	24	*
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| 31->45	31	*
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| 32->48	34	*
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| affected rows: 1
 | |
| info: Rows matched: 1  Changed: 1  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with EXISTS and reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1 where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 3	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->11	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->12	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with IN predicand over the updated table in WHERE
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1)
 | |
| update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select c3 from t1;
 | |
| c3
 | |
| 111
 | |
| 112
 | |
| 113
 | |
| 114
 | |
| 115
 | |
| 116
 | |
| 117
 | |
| 118
 | |
| 121
 | |
| 122
 | |
| 123
 | |
| 124
 | |
| 125
 | |
| 126
 | |
| 127
 | |
| 128
 | |
| 131
 | |
| 132
 | |
| 133
 | |
| 134
 | |
| 135
 | |
| 136
 | |
| 137
 | |
| 138
 | |
| 141
 | |
| 142
 | |
| 143
 | |
| 144
 | |
| 145
 | |
| 146
 | |
| 147
 | |
| 148
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	eq_ref	PRIMARY	PRIMARY	4	test.t1.c3	1	
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit and an order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	index	NULL	PRIMARY	4	NULL	2	
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	index	NULL	PRIMARY	4	NULL	2	Using buffer
 | |
| 2	DEPENDENT SUBQUERY	a	eq_ref	PRIMARY	PRIMARY	4	test.t1.c3	1	
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Update with error "Subquery returns more than 1 row"
 | |
| update t1 set c2=(select c2 from t1);
 | |
| ERROR 21000: Subquery returns more than 1 row
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| # Update with error "Subquery returns more than 1 row"
 | |
| # and order by
 | |
| update t1 set c2=(select c2 from t1) order by c3;
 | |
| ERROR 21000: Subquery returns more than 1 row
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| # Duplicate value on update a primary key
 | |
| update t1 set c3=0
 | |
| where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| ERROR 23000: Duplicate entry '0' for key 'PRIMARY'
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Duplicate value on update a primary key with ignore
 | |
| update ignore t1 set c3=0
 | |
| where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	0
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Duplicate value on update a primary key and limit
 | |
| update t1 set c3=0
 | |
| where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 limit 2;
 | |
| ERROR 23000: Duplicate entry '0' for key 'PRIMARY'
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Duplicate value on update a primary key with ignore
 | |
| # and limit
 | |
| update ignore t1 set c3=0
 | |
| where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	0
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Update no rows found
 | |
| update t1 set c1=10
 | |
| where c1 <2 and exists (select 'X' from t1 a where a.c1 = t1.c1 + 10);
 | |
| affected rows: 3
 | |
| info: Rows matched: 3  Changed: 3  Warnings: 0
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 10	1	1
 | |
| 10	2	2
 | |
| 10	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Update no rows changed
 | |
| drop trigger trg_t1;
 | |
| update t1 set c1=c1
 | |
| where c1 <2 and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| affected rows: 0
 | |
| info: Rows matched: 3  Changed: 0  Warnings: 0
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Check call of after trigger
 | |
| #
 | |
| create or replace trigger trg_t2 after update on t1 for each row
 | |
| begin
 | |
| declare msg varchar(100);
 | |
| if (new.c3 = 5) then
 | |
| set msg=concat('in after update trigger on ',new.c3);
 | |
| SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
 | |
| end if;
 | |
| end;
 | |
| /
 | |
| update t1 set c1=2
 | |
| where c3 in (select distinct a.c3 from t1 a where a.c1=t1.c1);
 | |
| ERROR 45000: in after update trigger on 5
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Check update with order by and after trigger
 | |
| #
 | |
| update t1 set c1=2
 | |
| where c3 in (select distinct a.c3 from t1 a where a.c1=t1.c1)
 | |
| order by t1.c2, t1.c1;
 | |
| ERROR 45000: in after update trigger on 5
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| drop view v1;
 | |
| #
 | |
| # Check update on view with check option
 | |
| #
 | |
| create view v1 as select * from t1 where c2=2 with check option;
 | |
| update v1 set c2=3 where c1=1;
 | |
| ERROR 44000: CHECK OPTION failed `test`.`v1`
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| update v1 set c2=(select max(c3) from v1) where c1=1;
 | |
| ERROR 44000: CHECK OPTION failed `test`.`v1`
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| update v1 set c2=(select min(va.c3) from v1 va), c1=0 where c1=1;
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 0	2	2
 | |
| 1	1	1
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| drop table tmp;
 | |
| drop view v1;
 | |
| drop table t1;
 | |
| #
 | |
| # Test on dynamic columns (blob)
 | |
| #
 | |
| create table assets (
 | |
| item_name varchar(32) primary key, -- A common attribute for all items
 | |
| dynamic_cols  blob  -- Dynamic columns will be stored here
 | |
| );
 | |
| INSERT INTO assets VALUES ('MariaDB T-shirt',
 | |
| COLUMN_CREATE('color', 'blue', 'size', 'XL'));
 | |
| INSERT INTO assets VALUES ('Thinkpad Laptop',
 | |
| COLUMN_CREATE('color', 'black', 'price', 500));
 | |
| SELECT item_name, COLUMN_GET(dynamic_cols, 'color' as char) AS color
 | |
| FROM assets;
 | |
| item_name	color
 | |
| MariaDB T-shirt	blue
 | |
| Thinkpad Laptop	black
 | |
| UPDATE assets
 | |
| SET dynamic_cols=COLUMN_ADD(dynamic_cols, 'warranty', '3 years')
 | |
| WHERE item_name='Thinkpad Laptop';
 | |
| SELECT item_name,
 | |
| COLUMN_GET(dynamic_cols, 'warranty' as char) AS color
 | |
| FROM assets;
 | |
| item_name	color
 | |
| MariaDB T-shirt	NULL
 | |
| Thinkpad Laptop	3 years
 | |
| UPDATE assets
 | |
| SET dynamic_cols=COLUMN_ADD(dynamic_cols, 'warranty', '4 years')
 | |
| WHERE item_name in
 | |
| (select b.item_name from assets b
 | |
| where COLUMN_GET(b.dynamic_cols, 'color' as char) ='black');
 | |
| SELECT item_name,
 | |
| COLUMN_GET(dynamic_cols, 'warranty' as char) AS color
 | |
| FROM assets;
 | |
| item_name	color
 | |
| MariaDB T-shirt	NULL
 | |
| Thinkpad Laptop	4 years
 | |
| UPDATE assets SET dynamic_cols=COLUMN_ADD(dynamic_cols, 'warranty',
 | |
| (select COLUMN_GET(b.dynamic_cols, 'color' as char)
 | |
| from assets b
 | |
| where assets.item_name = item_name));
 | |
| SELECT item_name,
 | |
| COLUMN_GET(dynamic_cols, 'warranty' as char) AS color
 | |
| FROM assets;
 | |
| item_name	color
 | |
| MariaDB T-shirt	blue
 | |
| Thinkpad Laptop	black
 | |
| drop table assets;
 | |
| #
 | |
| # Test on fulltext columns
 | |
| #
 | |
| CREATE TABLE ft2(copy TEXT,FULLTEXT(copy));
 | |
| INSERT INTO ft2(copy) VALUES
 | |
| ('MySQL vs MariaDB database'),
 | |
| ('Oracle vs MariaDB database'),
 | |
| ('PostgreSQL vs MariaDB database'),
 | |
| ('MariaDB overview'),
 | |
| ('Foreign keys'),
 | |
| ('Primary keys'),
 | |
| ('Indexes'),
 | |
| ('Transactions'),
 | |
| ('Triggers');
 | |
| SELECT * FROM ft2 WHERE MATCH(copy) AGAINST('database');
 | |
| copy
 | |
| MySQL vs MariaDB database
 | |
| Oracle vs MariaDB database
 | |
| PostgreSQL vs MariaDB database
 | |
| update ft2 set copy = (select max(concat('mykeyword ',substr(b.copy,1,5)))
 | |
| from ft2 b WHERE MATCH(b.copy) AGAINST('database'))
 | |
| where MATCH(copy) AGAINST('keys');
 | |
| SELECT * FROM ft2 WHERE MATCH(copy) AGAINST('mykeyword');
 | |
| copy
 | |
| mykeyword Postg
 | |
| mykeyword Postg
 | |
| drop table ft2;
 | |
| #######################################
 | |
| #                                     #
 | |
| #            Engine Aria              #
 | |
| #                                     #
 | |
| #######################################
 | |
| set default_storage_engine=Aria;
 | |
| create table t1 (old_c1 integer,
 | |
| old_c2 integer,
 | |
| c1 integer,
 | |
| c2 integer,
 | |
| c3 integer);
 | |
| create view v1 as select * from t1 where c2=2;
 | |
| create trigger trg_t1 before update on t1 for each row
 | |
| begin
 | |
| set new.old_c1=old.c1;
 | |
| set new.old_c2=old.c2;
 | |
| end;
 | |
| /
 | |
| insert into t1(c1,c2,c3)
 | |
| values (1,1,1), (1,2,2), (1,3,3),
 | |
| (2,1,4), (2,2,5), (2,3,6),
 | |
| (2,4,7), (2,5,8);
 | |
| insert into t1 select NULL, NULL, c1+10,c2,c3+10 from t1;
 | |
| insert into t1 select NULL, NULL, c1+20,c2+1,c3+20 from t1;
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| create table tmp as select * from t1;
 | |
| #######################################
 | |
| #        Test without any index       #
 | |
| #######################################
 | |
| #
 | |
| # Update with value from subquery on the same table
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	Table is already up to date
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->5	5	*
 | |
| 2->6	6	*
 | |
| 2->7	7	*
 | |
| 2->8	8	*
 | |
| 11->11	11	 
 | |
| 11->12	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->15	15	*
 | |
| 12->16	16	*
 | |
| 12->17	17	*
 | |
| 12->18	18	*
 | |
| 21->21	21	 
 | |
| 21->22	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->25	25	*
 | |
| 22->26	26	*
 | |
| 22->27	27	*
 | |
| 22->28	28	*
 | |
| 31->31	31	 
 | |
| 31->32	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->35	35	*
 | |
| 32->36	36	*
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + possibly sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1)
 | |
| update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| affected rows: 3
 | |
| info: Rows matched: 3  Changed: 3  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->10	1	*
 | |
| 1->10	2	*
 | |
| 1->10	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + non-sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; Using filesort
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; Using filesort
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a reference to view in subquery
 | |
| # in settable value
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->3	1	*
 | |
| 1->3	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->4	5	*
 | |
| 2->4	6	*
 | |
| 2->4	7	*
 | |
| 2->4	8	*
 | |
| 11->13	11	*
 | |
| 11->13	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->14	15	*
 | |
| 12->14	16	*
 | |
| 12->14	17	*
 | |
| 12->14	18	*
 | |
| 21->23	21	*
 | |
| 21->23	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->24	25	*
 | |
| 22->24	26	*
 | |
| 22->24	27	*
 | |
| 22->24	28	*
 | |
| 31->33	31	*
 | |
| 31->33	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->34	35	*
 | |
| 32->34	36	*
 | |
| 32->34	37	*
 | |
| 32->34	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| explain update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| affected rows: 7
 | |
| info: Rows matched: 7  Changed: 7  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->17	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| 11->24	12	*
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| 12->27	15	*
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| 21->35	21	*
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| 22->38	24	*
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| 31->45	31	*
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| 32->48	34	*
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| affected rows: 1
 | |
| info: Rows matched: 1  Changed: 1  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with EXISTS and reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1 where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 3	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->11	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->12	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with IN predicand over the updated table in WHERE
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1)
 | |
| update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select c3 from t1;
 | |
| c3
 | |
| 111
 | |
| 112
 | |
| 113
 | |
| 114
 | |
| 115
 | |
| 116
 | |
| 117
 | |
| 118
 | |
| 121
 | |
| 122
 | |
| 123
 | |
| 124
 | |
| 125
 | |
| 126
 | |
| 127
 | |
| 128
 | |
| 131
 | |
| 132
 | |
| 133
 | |
| 134
 | |
| 135
 | |
| 136
 | |
| 137
 | |
| 138
 | |
| 141
 | |
| 142
 | |
| 143
 | |
| 144
 | |
| 145
 | |
| 146
 | |
| 147
 | |
| 148
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit and an order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	Using filesort
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using filesort
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #######################################
 | |
| #          Test with an index         #
 | |
| #######################################
 | |
| create index t1_c2 on t1 (c2,c1);
 | |
| analyze table t1;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| #
 | |
| # Update with value from subquery on the same table
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	Table is already up to date
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->5	5	*
 | |
| 2->6	6	*
 | |
| 2->7	7	*
 | |
| 2->8	8	*
 | |
| 11->11	11	 
 | |
| 11->12	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->15	15	*
 | |
| 12->16	16	*
 | |
| 12->17	17	*
 | |
| 12->18	18	*
 | |
| 21->21	21	 
 | |
| 21->22	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->25	25	*
 | |
| 22->26	26	*
 | |
| 22->27	27	*
 | |
| 22->28	28	*
 | |
| 31->31	31	 
 | |
| 31->32	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->35	35	*
 | |
| 32->36	36	*
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + possibly sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	index	NULL	t1_c2	10	NULL	32	Using where; Using index; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	index	NULL	t1_c2	10	NULL	32	Using where; Using index; FirstMatch(t1)
 | |
| update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| affected rows: 3
 | |
| info: Rows matched: 3  Changed: 3  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->10	1	*
 | |
| 1->10	2	*
 | |
| 1->10	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + non-sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	range	t1_c2	t1_c2	5	NULL	21	Using index condition
 | |
| 1	PRIMARY	a	ref	t1_c2	t1_c2	5	test.t1.c2	5	Using index; FirstMatch(t1)
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	range	t1_c2	t1_c2	5	NULL	21	Using index condition
 | |
| 1	PRIMARY	a	ref	t1_c2	t1_c2	5	test.t1.c2	5	Using index; FirstMatch(t1)
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	range	t1_c2	t1_c2	5	NULL	21	Using index condition
 | |
| 1	PRIMARY	a	ref	t1_c2	t1_c2	5	test.t1.c2	5	Using index; FirstMatch(t1)
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	range	t1_c2	t1_c2	5	NULL	21	Using index condition
 | |
| 1	PRIMARY	a	ref	t1_c2	t1_c2	5	test.t1.c2	5	Using index; FirstMatch(t1)
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a reference to view in subquery
 | |
| # in settable value
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	t1	ref	t1_c2	t1_c2	10	const,test.t1.c1	1	Using index
 | |
| update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->3	1	*
 | |
| 1->3	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->4	5	*
 | |
| 2->4	6	*
 | |
| 2->4	7	*
 | |
| 2->4	8	*
 | |
| 11->13	11	*
 | |
| 11->13	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->14	15	*
 | |
| 12->14	16	*
 | |
| 12->14	17	*
 | |
| 12->14	18	*
 | |
| 21->23	21	*
 | |
| 21->23	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->24	25	*
 | |
| 22->24	26	*
 | |
| 22->24	27	*
 | |
| 22->24	28	*
 | |
| 31->33	31	*
 | |
| 31->33	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->34	35	*
 | |
| 32->34	36	*
 | |
| 32->34	37	*
 | |
| 32->34	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ref	t1_c2	t1_c2	5	const	8	
 | |
| explain update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ref	t1_c2	t1_c2	5	const	8	Using where
 | |
| 2	DEPENDENT SUBQUERY	a	index	NULL	t1_c2	10	NULL	32	Using where; Using index
 | |
| update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| affected rows: 7
 | |
| info: Rows matched: 7  Changed: 7  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->17	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| 11->24	12	*
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| 12->27	15	*
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| 21->35	21	*
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| 22->38	24	*
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| 31->45	31	*
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| 32->48	34	*
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	range	t1_c2	t1_c2	10	NULL	1	Using index condition
 | |
| 1	PRIMARY	t1	ref	t1_c2	t1_c2	10	const,test.t1.c1	1	Using index; FirstMatch(t1)
 | |
| explain update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	range	t1_c2	t1_c2	10	NULL	1	Using index condition; Using where
 | |
| 2	DEPENDENT SUBQUERY	t1	ref	t1_c2	t1_c2	10	const,func	1	Using where; Using index
 | |
| update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| affected rows: 1
 | |
| info: Rows matched: 1  Changed: 1  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with EXISTS and reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1 where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	range	t1_c2	t1_c2	10	NULL	2	Using index condition
 | |
| 1	PRIMARY	t1	ref	t1_c2	t1_c2	5	const	8	Using index; FirstMatch(t1)
 | |
| explain update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	range	t1_c2	t1_c2	10	NULL	2	Using index condition
 | |
| 3	DEPENDENT SUBQUERY	t1	ref	t1_c2	t1_c2	5	const	8	Using where; Using index
 | |
| 2	DEPENDENT SUBQUERY	t1	ref	t1_c2	t1_c2	10	const,test.t1.c1	1	Using index
 | |
| update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->11	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->12	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with IN predicand over the updated table in WHERE
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ref	t1_c2	t1_c2	10	test.t1.c2,test.t1.c1	1	Using index; FirstMatch(t1)
 | |
| explain update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ref	t1_c2	t1_c2	10	test.t1.c2,test.t1.c1	1	Using index; FirstMatch(t1)
 | |
| update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select c3 from t1;
 | |
| c3
 | |
| 111
 | |
| 112
 | |
| 113
 | |
| 114
 | |
| 115
 | |
| 116
 | |
| 117
 | |
| 118
 | |
| 121
 | |
| 122
 | |
| 123
 | |
| 124
 | |
| 125
 | |
| 126
 | |
| 127
 | |
| 128
 | |
| 131
 | |
| 132
 | |
| 133
 | |
| 134
 | |
| 135
 | |
| 136
 | |
| 137
 | |
| 138
 | |
| 141
 | |
| 142
 | |
| 143
 | |
| 144
 | |
| 145
 | |
| 146
 | |
| 147
 | |
| 148
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit and an order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	Using filesort
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using filesort
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #######################################
 | |
| #       Test with a primary key       #
 | |
| #######################################
 | |
| drop index t1_c2 on t1;
 | |
| alter table t1 add primary key (c3);
 | |
| analyze table t1;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| #
 | |
| # Update with value from subquery on the same table
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	Table is already up to date
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	eq_ref	PRIMARY	PRIMARY	4	test.t1.c3	1	Using index
 | |
| update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->5	5	*
 | |
| 2->6	6	*
 | |
| 2->7	7	*
 | |
| 2->8	8	*
 | |
| 11->11	11	 
 | |
| 11->12	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->15	15	*
 | |
| 12->16	16	*
 | |
| 12->17	17	*
 | |
| 12->18	18	*
 | |
| 21->21	21	 
 | |
| 21->22	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->25	25	*
 | |
| 22->26	26	*
 | |
| 22->27	27	*
 | |
| 22->28	28	*
 | |
| 31->31	31	 
 | |
| 31->32	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->35	35	*
 | |
| 32->36	36	*
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + possibly sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1)
 | |
| update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| affected rows: 3
 | |
| info: Rows matched: 3  Changed: 3  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->10	1	*
 | |
| 1->10	2	*
 | |
| 1->10	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + non-sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; Using filesort
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; Using filesort
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a reference to view in subquery
 | |
| # in settable value
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->3	1	*
 | |
| 1->3	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->4	5	*
 | |
| 2->4	6	*
 | |
| 2->4	7	*
 | |
| 2->4	8	*
 | |
| 11->13	11	*
 | |
| 11->13	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->14	15	*
 | |
| 12->14	16	*
 | |
| 12->14	17	*
 | |
| 12->14	18	*
 | |
| 21->23	21	*
 | |
| 21->23	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->24	25	*
 | |
| 22->24	26	*
 | |
| 22->24	27	*
 | |
| 22->24	28	*
 | |
| 31->33	31	*
 | |
| 31->33	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->34	35	*
 | |
| 32->34	36	*
 | |
| 32->34	37	*
 | |
| 32->34	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| explain update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	range	PRIMARY	PRIMARY	4	NULL	30	Using index condition; Using where
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| affected rows: 7
 | |
| info: Rows matched: 7  Changed: 7  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->17	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| 11->24	12	*
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| 12->27	15	*
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| 21->35	21	*
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| 22->38	24	*
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| 31->45	31	*
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| 32->48	34	*
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| affected rows: 1
 | |
| info: Rows matched: 1  Changed: 1  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with EXISTS and reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1 where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 3	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->11	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->12	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with IN predicand over the updated table in WHERE
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1)
 | |
| update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select c3 from t1;
 | |
| c3
 | |
| 111
 | |
| 112
 | |
| 113
 | |
| 114
 | |
| 115
 | |
| 116
 | |
| 117
 | |
| 118
 | |
| 121
 | |
| 122
 | |
| 123
 | |
| 124
 | |
| 125
 | |
| 126
 | |
| 127
 | |
| 128
 | |
| 131
 | |
| 132
 | |
| 133
 | |
| 134
 | |
| 135
 | |
| 136
 | |
| 137
 | |
| 138
 | |
| 141
 | |
| 142
 | |
| 143
 | |
| 144
 | |
| 145
 | |
| 146
 | |
| 147
 | |
| 148
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	eq_ref	PRIMARY	PRIMARY	4	test.t1.c3	1	Using index
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit and an order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	index	NULL	PRIMARY	4	NULL	2	
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	index	NULL	PRIMARY	4	NULL	2	Using buffer
 | |
| 2	DEPENDENT SUBQUERY	a	eq_ref	PRIMARY	PRIMARY	4	test.t1.c3	1	Using index
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Update with error "Subquery returns more than 1 row"
 | |
| update t1 set c2=(select c2 from t1);
 | |
| ERROR 21000: Subquery returns more than 1 row
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| # Update with error "Subquery returns more than 1 row"
 | |
| # and order by
 | |
| update t1 set c2=(select c2 from t1) order by c3;
 | |
| ERROR 21000: Subquery returns more than 1 row
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| # Duplicate value on update a primary key
 | |
| update t1 set c3=0
 | |
| where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| ERROR 23000: Duplicate entry '0' for key 'PRIMARY'
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	0
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Duplicate value on update a primary key with ignore
 | |
| update ignore t1 set c3=0
 | |
| where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	0
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Duplicate value on update a primary key and limit
 | |
| update t1 set c3=0
 | |
| where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 limit 2;
 | |
| ERROR 23000: Duplicate entry '0' for key 'PRIMARY'
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	0
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Duplicate value on update a primary key with ignore
 | |
| # and limit
 | |
| update ignore t1 set c3=0
 | |
| where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	0
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Update no rows found
 | |
| update t1 set c1=10
 | |
| where c1 <2 and exists (select 'X' from t1 a where a.c1 = t1.c1 + 10);
 | |
| affected rows: 3
 | |
| info: Rows matched: 3  Changed: 3  Warnings: 0
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 10	1	1
 | |
| 10	2	2
 | |
| 10	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Update no rows changed
 | |
| drop trigger trg_t1;
 | |
| update t1 set c1=c1
 | |
| where c1 <2 and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| affected rows: 0
 | |
| info: Rows matched: 3  Changed: 0  Warnings: 0
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Check call of after trigger
 | |
| #
 | |
| create or replace trigger trg_t2 after update on t1 for each row
 | |
| begin
 | |
| declare msg varchar(100);
 | |
| if (new.c3 = 5) then
 | |
| set msg=concat('in after update trigger on ',new.c3);
 | |
| SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
 | |
| end if;
 | |
| end;
 | |
| /
 | |
| update t1 set c1=2
 | |
| where c3 in (select distinct a.c3 from t1 a where a.c1=t1.c1);
 | |
| ERROR 45000: in after update trigger on 5
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	1
 | |
| 2	1	4
 | |
| 2	2	2
 | |
| 2	2	5
 | |
| 2	3	3
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Check update with order by and after trigger
 | |
| #
 | |
| update t1 set c1=2
 | |
| where c3 in (select distinct a.c3 from t1 a where a.c1=t1.c1)
 | |
| order by t1.c2, t1.c1;
 | |
| ERROR 45000: in after update trigger on 5
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	3	3
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	1
 | |
| 2	1	11
 | |
| 2	1	14
 | |
| 2	1	4
 | |
| 2	2	2
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| drop view v1;
 | |
| #
 | |
| # Check update on view with check option
 | |
| #
 | |
| create view v1 as select * from t1 where c2=2 with check option;
 | |
| update v1 set c2=3 where c1=1;
 | |
| ERROR 44000: CHECK OPTION failed `test`.`v1`
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| update v1 set c2=(select max(c3) from v1) where c1=1;
 | |
| ERROR 44000: CHECK OPTION failed `test`.`v1`
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| update v1 set c2=(select min(va.c3) from v1 va), c1=0 where c1=1;
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 0	2	2
 | |
| 1	1	1
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| drop table tmp;
 | |
| drop view v1;
 | |
| drop table t1;
 | |
| #
 | |
| # Test on dynamic columns (blob)
 | |
| #
 | |
| create table assets (
 | |
| item_name varchar(32) primary key, -- A common attribute for all items
 | |
| dynamic_cols  blob  -- Dynamic columns will be stored here
 | |
| );
 | |
| INSERT INTO assets VALUES ('MariaDB T-shirt',
 | |
| COLUMN_CREATE('color', 'blue', 'size', 'XL'));
 | |
| INSERT INTO assets VALUES ('Thinkpad Laptop',
 | |
| COLUMN_CREATE('color', 'black', 'price', 500));
 | |
| SELECT item_name, COLUMN_GET(dynamic_cols, 'color' as char) AS color
 | |
| FROM assets;
 | |
| item_name	color
 | |
| MariaDB T-shirt	blue
 | |
| Thinkpad Laptop	black
 | |
| UPDATE assets
 | |
| SET dynamic_cols=COLUMN_ADD(dynamic_cols, 'warranty', '3 years')
 | |
| WHERE item_name='Thinkpad Laptop';
 | |
| SELECT item_name,
 | |
| COLUMN_GET(dynamic_cols, 'warranty' as char) AS color
 | |
| FROM assets;
 | |
| item_name	color
 | |
| MariaDB T-shirt	NULL
 | |
| Thinkpad Laptop	3 years
 | |
| UPDATE assets
 | |
| SET dynamic_cols=COLUMN_ADD(dynamic_cols, 'warranty', '4 years')
 | |
| WHERE item_name in
 | |
| (select b.item_name from assets b
 | |
| where COLUMN_GET(b.dynamic_cols, 'color' as char) ='black');
 | |
| SELECT item_name,
 | |
| COLUMN_GET(dynamic_cols, 'warranty' as char) AS color
 | |
| FROM assets;
 | |
| item_name	color
 | |
| MariaDB T-shirt	NULL
 | |
| Thinkpad Laptop	4 years
 | |
| UPDATE assets SET dynamic_cols=COLUMN_ADD(dynamic_cols, 'warranty',
 | |
| (select COLUMN_GET(b.dynamic_cols, 'color' as char)
 | |
| from assets b
 | |
| where assets.item_name = item_name));
 | |
| SELECT item_name,
 | |
| COLUMN_GET(dynamic_cols, 'warranty' as char) AS color
 | |
| FROM assets;
 | |
| item_name	color
 | |
| MariaDB T-shirt	blue
 | |
| Thinkpad Laptop	black
 | |
| drop table assets;
 | |
| #
 | |
| # Test on fulltext columns
 | |
| #
 | |
| CREATE TABLE ft2(copy TEXT,FULLTEXT(copy));
 | |
| INSERT INTO ft2(copy) VALUES
 | |
| ('MySQL vs MariaDB database'),
 | |
| ('Oracle vs MariaDB database'),
 | |
| ('PostgreSQL vs MariaDB database'),
 | |
| ('MariaDB overview'),
 | |
| ('Foreign keys'),
 | |
| ('Primary keys'),
 | |
| ('Indexes'),
 | |
| ('Transactions'),
 | |
| ('Triggers');
 | |
| SELECT * FROM ft2 WHERE MATCH(copy) AGAINST('database');
 | |
| copy
 | |
| MySQL vs MariaDB database
 | |
| Oracle vs MariaDB database
 | |
| PostgreSQL vs MariaDB database
 | |
| update ft2 set copy = (select max(concat('mykeyword ',substr(b.copy,1,5)))
 | |
| from ft2 b WHERE MATCH(b.copy) AGAINST('database'))
 | |
| where MATCH(copy) AGAINST('keys');
 | |
| SELECT * FROM ft2 WHERE MATCH(copy) AGAINST('mykeyword');
 | |
| copy
 | |
| mykeyword Postg
 | |
| mykeyword Postg
 | |
| drop table ft2;
 | |
| #######################################
 | |
| #                                     #
 | |
| #            Engine MyISAM            #
 | |
| #                                     #
 | |
| #######################################
 | |
| set default_storage_engine=MyISAM;
 | |
| create table t1 (old_c1 integer,
 | |
| old_c2 integer,
 | |
| c1 integer,
 | |
| c2 integer,
 | |
| c3 integer);
 | |
| create view v1 as select * from t1 where c2=2;
 | |
| create trigger trg_t1 before update on t1 for each row
 | |
| begin
 | |
| set new.old_c1=old.c1;
 | |
| set new.old_c2=old.c2;
 | |
| end;
 | |
| /
 | |
| insert into t1(c1,c2,c3)
 | |
| values (1,1,1), (1,2,2), (1,3,3),
 | |
| (2,1,4), (2,2,5), (2,3,6),
 | |
| (2,4,7), (2,5,8);
 | |
| insert into t1 select NULL, NULL, c1+10,c2,c3+10 from t1;
 | |
| insert into t1 select NULL, NULL, c1+20,c2+1,c3+20 from t1;
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| create table tmp as select * from t1;
 | |
| #######################################
 | |
| #        Test without any index       #
 | |
| #######################################
 | |
| #
 | |
| # Update with value from subquery on the same table
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	Table is already up to date
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->5	5	*
 | |
| 2->6	6	*
 | |
| 2->7	7	*
 | |
| 2->8	8	*
 | |
| 11->11	11	 
 | |
| 11->12	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->15	15	*
 | |
| 12->16	16	*
 | |
| 12->17	17	*
 | |
| 12->18	18	*
 | |
| 21->21	21	 
 | |
| 21->22	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->25	25	*
 | |
| 22->26	26	*
 | |
| 22->27	27	*
 | |
| 22->28	28	*
 | |
| 31->31	31	 
 | |
| 31->32	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->35	35	*
 | |
| 32->36	36	*
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + possibly sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1)
 | |
| update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| affected rows: 3
 | |
| info: Rows matched: 3  Changed: 3  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->10	1	*
 | |
| 1->10	2	*
 | |
| 1->10	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + non-sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; Using filesort
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; Using filesort
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a reference to view in subquery
 | |
| # in settable value
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->3	1	*
 | |
| 1->3	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->4	5	*
 | |
| 2->4	6	*
 | |
| 2->4	7	*
 | |
| 2->4	8	*
 | |
| 11->13	11	*
 | |
| 11->13	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->14	15	*
 | |
| 12->14	16	*
 | |
| 12->14	17	*
 | |
| 12->14	18	*
 | |
| 21->23	21	*
 | |
| 21->23	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->24	25	*
 | |
| 22->24	26	*
 | |
| 22->24	27	*
 | |
| 22->24	28	*
 | |
| 31->33	31	*
 | |
| 31->33	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->34	35	*
 | |
| 32->34	36	*
 | |
| 32->34	37	*
 | |
| 32->34	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| explain update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| affected rows: 7
 | |
| info: Rows matched: 7  Changed: 7  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->17	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| 11->24	12	*
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| 12->27	15	*
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| 21->35	21	*
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| 22->38	24	*
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| 31->45	31	*
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| 32->48	34	*
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| affected rows: 1
 | |
| info: Rows matched: 1  Changed: 1  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with EXISTS and reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1 where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 3	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->11	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->12	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with IN predicand over the updated table in WHERE
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1)
 | |
| update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select c3 from t1;
 | |
| c3
 | |
| 111
 | |
| 112
 | |
| 113
 | |
| 114
 | |
| 115
 | |
| 116
 | |
| 117
 | |
| 118
 | |
| 121
 | |
| 122
 | |
| 123
 | |
| 124
 | |
| 125
 | |
| 126
 | |
| 127
 | |
| 128
 | |
| 131
 | |
| 132
 | |
| 133
 | |
| 134
 | |
| 135
 | |
| 136
 | |
| 137
 | |
| 138
 | |
| 141
 | |
| 142
 | |
| 143
 | |
| 144
 | |
| 145
 | |
| 146
 | |
| 147
 | |
| 148
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit and an order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	Using filesort
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using filesort
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #######################################
 | |
| #          Test with an index         #
 | |
| #######################################
 | |
| create index t1_c2 on t1 (c2,c1);
 | |
| analyze table t1;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| #
 | |
| # Update with value from subquery on the same table
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	Table is already up to date
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->5	5	*
 | |
| 2->6	6	*
 | |
| 2->7	7	*
 | |
| 2->8	8	*
 | |
| 11->11	11	 
 | |
| 11->12	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->15	15	*
 | |
| 12->16	16	*
 | |
| 12->17	17	*
 | |
| 12->18	18	*
 | |
| 21->21	21	 
 | |
| 21->22	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->25	25	*
 | |
| 22->26	26	*
 | |
| 22->27	27	*
 | |
| 22->28	28	*
 | |
| 31->31	31	 
 | |
| 31->32	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->35	35	*
 | |
| 32->36	36	*
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + possibly sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	index	NULL	t1_c2	10	NULL	32	Using where; Using index; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	index	NULL	t1_c2	10	NULL	32	Using where; Using index; FirstMatch(t1)
 | |
| update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| affected rows: 3
 | |
| info: Rows matched: 3  Changed: 3  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->10	1	*
 | |
| 1->10	2	*
 | |
| 1->10	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + non-sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ref	t1_c2	t1_c2	5	test.t1.c2	5	Using index; FirstMatch(t1)
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ref	t1_c2	t1_c2	5	test.t1.c2	5	Using index; FirstMatch(t1)
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where; Using filesort
 | |
| 1	PRIMARY	a	ref	t1_c2	t1_c2	5	test.t1.c2	5	Using index; FirstMatch(t1)
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where; Using filesort
 | |
| 1	PRIMARY	a	ref	t1_c2	t1_c2	5	test.t1.c2	5	Using index; FirstMatch(t1)
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a reference to view in subquery
 | |
| # in settable value
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	t1	ref	t1_c2	t1_c2	10	const,test.t1.c1	1	Using index
 | |
| update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->3	1	*
 | |
| 1->3	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->4	5	*
 | |
| 2->4	6	*
 | |
| 2->4	7	*
 | |
| 2->4	8	*
 | |
| 11->13	11	*
 | |
| 11->13	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->14	15	*
 | |
| 12->14	16	*
 | |
| 12->14	17	*
 | |
| 12->14	18	*
 | |
| 21->23	21	*
 | |
| 21->23	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->24	25	*
 | |
| 22->24	26	*
 | |
| 22->24	27	*
 | |
| 22->24	28	*
 | |
| 31->33	31	*
 | |
| 31->33	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->34	35	*
 | |
| 32->34	36	*
 | |
| 32->34	37	*
 | |
| 32->34	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ref	t1_c2	t1_c2	5	const	8	
 | |
| explain update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ref	t1_c2	t1_c2	5	const	8	Using where
 | |
| 2	DEPENDENT SUBQUERY	a	index	NULL	t1_c2	10	NULL	32	Using where; Using index
 | |
| update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| affected rows: 7
 | |
| info: Rows matched: 7  Changed: 7  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->17	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| 11->24	12	*
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| 12->27	15	*
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| 21->35	21	*
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| 22->38	24	*
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| 31->45	31	*
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| 32->48	34	*
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	range	t1_c2	t1_c2	10	NULL	1	Using index condition
 | |
| 1	PRIMARY	t1	ref	t1_c2	t1_c2	10	const,test.t1.c1	1	Using index; FirstMatch(t1)
 | |
| explain update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	range	t1_c2	t1_c2	10	NULL	1	Using index condition; Using where
 | |
| 2	DEPENDENT SUBQUERY	t1	ref	t1_c2	t1_c2	10	const,func	1	Using where; Using index
 | |
| update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| affected rows: 1
 | |
| info: Rows matched: 1  Changed: 1  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with EXISTS and reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1 where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	range	t1_c2	t1_c2	10	NULL	2	Using index condition
 | |
| 1	PRIMARY	t1	ref	t1_c2	t1_c2	5	const	8	Using index; FirstMatch(t1)
 | |
| explain update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	range	t1_c2	t1_c2	10	NULL	2	Using index condition
 | |
| 3	DEPENDENT SUBQUERY	t1	ref	t1_c2	t1_c2	5	const	8	Using where; Using index
 | |
| 2	DEPENDENT SUBQUERY	t1	ref	t1_c2	t1_c2	10	const,test.t1.c1	1	Using index
 | |
| update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->11	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->12	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with IN predicand over the updated table in WHERE
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ref	t1_c2	t1_c2	10	test.t1.c2,test.t1.c1	1	Using index; FirstMatch(t1)
 | |
| explain update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ref	t1_c2	t1_c2	10	test.t1.c2,test.t1.c1	1	Using index; FirstMatch(t1)
 | |
| update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select c3 from t1;
 | |
| c3
 | |
| 111
 | |
| 112
 | |
| 113
 | |
| 114
 | |
| 115
 | |
| 116
 | |
| 117
 | |
| 118
 | |
| 121
 | |
| 122
 | |
| 123
 | |
| 124
 | |
| 125
 | |
| 126
 | |
| 127
 | |
| 128
 | |
| 131
 | |
| 132
 | |
| 133
 | |
| 134
 | |
| 135
 | |
| 136
 | |
| 137
 | |
| 138
 | |
| 141
 | |
| 142
 | |
| 143
 | |
| 144
 | |
| 145
 | |
| 146
 | |
| 147
 | |
| 148
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit and an order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	Using filesort
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using filesort
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #######################################
 | |
| #       Test with a primary key       #
 | |
| #######################################
 | |
| drop index t1_c2 on t1;
 | |
| alter table t1 add primary key (c3);
 | |
| analyze table t1;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| #
 | |
| # Update with value from subquery on the same table
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	Table is already up to date
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	eq_ref	PRIMARY	PRIMARY	4	test.t1.c3	1	Using index
 | |
| update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->5	5	*
 | |
| 2->6	6	*
 | |
| 2->7	7	*
 | |
| 2->8	8	*
 | |
| 11->11	11	 
 | |
| 11->12	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->15	15	*
 | |
| 12->16	16	*
 | |
| 12->17	17	*
 | |
| 12->18	18	*
 | |
| 21->21	21	 
 | |
| 21->22	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->25	25	*
 | |
| 22->26	26	*
 | |
| 22->27	27	*
 | |
| 22->28	28	*
 | |
| 31->31	31	 
 | |
| 31->32	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->35	35	*
 | |
| 32->36	36	*
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + possibly sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1)
 | |
| update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| affected rows: 3
 | |
| info: Rows matched: 3  Changed: 3  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->10	1	*
 | |
| 1->10	2	*
 | |
| 1->10	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + non-sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; Using filesort
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; Using filesort
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a reference to view in subquery
 | |
| # in settable value
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->3	1	*
 | |
| 1->3	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->4	5	*
 | |
| 2->4	6	*
 | |
| 2->4	7	*
 | |
| 2->4	8	*
 | |
| 11->13	11	*
 | |
| 11->13	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->14	15	*
 | |
| 12->14	16	*
 | |
| 12->14	17	*
 | |
| 12->14	18	*
 | |
| 21->23	21	*
 | |
| 21->23	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->24	25	*
 | |
| 22->24	26	*
 | |
| 22->24	27	*
 | |
| 22->24	28	*
 | |
| 31->33	31	*
 | |
| 31->33	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->34	35	*
 | |
| 32->34	36	*
 | |
| 32->34	37	*
 | |
| 32->34	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| explain update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	PRIMARY	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| affected rows: 7
 | |
| info: Rows matched: 7  Changed: 7  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->17	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| 11->24	12	*
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| 12->27	15	*
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| 21->35	21	*
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| 22->38	24	*
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| 31->45	31	*
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| 32->48	34	*
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| affected rows: 1
 | |
| info: Rows matched: 1  Changed: 1  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with EXISTS and reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from v1 where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 3	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->11	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->12	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with IN predicand over the updated table in WHERE
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1)
 | |
| update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select c3 from t1;
 | |
| c3
 | |
| 111
 | |
| 112
 | |
| 113
 | |
| 114
 | |
| 115
 | |
| 116
 | |
| 117
 | |
| 118
 | |
| 121
 | |
| 122
 | |
| 123
 | |
| 124
 | |
| 125
 | |
| 126
 | |
| 127
 | |
| 128
 | |
| 131
 | |
| 132
 | |
| 133
 | |
| 134
 | |
| 135
 | |
| 136
 | |
| 137
 | |
| 138
 | |
| 141
 | |
| 142
 | |
| 143
 | |
| 144
 | |
| 145
 | |
| 146
 | |
| 147
 | |
| 148
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	eq_ref	PRIMARY	PRIMARY	4	test.t1.c3	1	Using index
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit and an order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| explain select * from t1 order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	index	NULL	PRIMARY	4	NULL	2	
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	index	NULL	PRIMARY	4	NULL	2	Using buffer
 | |
| 2	DEPENDENT SUBQUERY	a	eq_ref	PRIMARY	PRIMARY	4	test.t1.c3	1	Using index
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Update with error "Subquery returns more than 1 row"
 | |
| update t1 set c2=(select c2 from t1);
 | |
| ERROR 21000: Subquery returns more than 1 row
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| # Update with error "Subquery returns more than 1 row"
 | |
| # and order by
 | |
| update t1 set c2=(select c2 from t1) order by c3;
 | |
| ERROR 21000: Subquery returns more than 1 row
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| # Duplicate value on update a primary key
 | |
| update t1 set c3=0
 | |
| where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| ERROR 23000: Duplicate entry '0' for key 'PRIMARY'
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	0
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Duplicate value on update a primary key with ignore
 | |
| update ignore t1 set c3=0
 | |
| where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	0
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Duplicate value on update a primary key and limit
 | |
| update t1 set c3=0
 | |
| where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 limit 2;
 | |
| ERROR 23000: Duplicate entry '0' for key 'PRIMARY'
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	0
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Duplicate value on update a primary key with ignore
 | |
| # and limit
 | |
| update ignore t1 set c3=0
 | |
| where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	0
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Update no rows found
 | |
| update t1 set c1=10
 | |
| where c1 <2 and exists (select 'X' from t1 a where a.c1 = t1.c1 + 10);
 | |
| affected rows: 3
 | |
| info: Rows matched: 3  Changed: 3  Warnings: 0
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 10	1	1
 | |
| 10	2	2
 | |
| 10	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Update no rows changed
 | |
| drop trigger trg_t1;
 | |
| update t1 set c1=c1
 | |
| where c1 <2 and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| affected rows: 0
 | |
| info: Rows matched: 3  Changed: 0  Warnings: 0
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Check call of after trigger
 | |
| #
 | |
| create or replace trigger trg_t2 after update on t1 for each row
 | |
| begin
 | |
| declare msg varchar(100);
 | |
| if (new.c3 = 5) then
 | |
| set msg=concat('in after update trigger on ',new.c3);
 | |
| SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
 | |
| end if;
 | |
| end;
 | |
| /
 | |
| update t1 set c1=2
 | |
| where c3 in (select distinct a.c3 from t1 a where a.c1=t1.c1);
 | |
| ERROR 45000: in after update trigger on 5
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	1
 | |
| 2	1	4
 | |
| 2	2	2
 | |
| 2	2	5
 | |
| 2	3	3
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Check update with order by and after trigger
 | |
| #
 | |
| update t1 set c1=2
 | |
| where c3 in (select distinct a.c3 from t1 a where a.c1=t1.c1)
 | |
| order by t1.c2, t1.c1;
 | |
| ERROR 45000: in after update trigger on 5
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	3	3
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	1
 | |
| 2	1	11
 | |
| 2	1	14
 | |
| 2	1	4
 | |
| 2	2	2
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| drop view v1;
 | |
| #
 | |
| # Check update on view with check option
 | |
| #
 | |
| create view v1 as select * from t1 where c2=2 with check option;
 | |
| update v1 set c2=3 where c1=1;
 | |
| ERROR 44000: CHECK OPTION failed `test`.`v1`
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| update v1 set c2=(select max(c3) from v1) where c1=1;
 | |
| ERROR 44000: CHECK OPTION failed `test`.`v1`
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| update v1 set c2=(select min(va.c3) from v1 va), c1=0 where c1=1;
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 0	2	2
 | |
| 1	1	1
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| drop table tmp;
 | |
| drop view v1;
 | |
| drop table t1;
 | |
| #
 | |
| # Test on dynamic columns (blob)
 | |
| #
 | |
| create table assets (
 | |
| item_name varchar(32) primary key, -- A common attribute for all items
 | |
| dynamic_cols  blob  -- Dynamic columns will be stored here
 | |
| );
 | |
| INSERT INTO assets VALUES ('MariaDB T-shirt',
 | |
| COLUMN_CREATE('color', 'blue', 'size', 'XL'));
 | |
| INSERT INTO assets VALUES ('Thinkpad Laptop',
 | |
| COLUMN_CREATE('color', 'black', 'price', 500));
 | |
| SELECT item_name, COLUMN_GET(dynamic_cols, 'color' as char) AS color
 | |
| FROM assets;
 | |
| item_name	color
 | |
| MariaDB T-shirt	blue
 | |
| Thinkpad Laptop	black
 | |
| UPDATE assets
 | |
| SET dynamic_cols=COLUMN_ADD(dynamic_cols, 'warranty', '3 years')
 | |
| WHERE item_name='Thinkpad Laptop';
 | |
| SELECT item_name,
 | |
| COLUMN_GET(dynamic_cols, 'warranty' as char) AS color
 | |
| FROM assets;
 | |
| item_name	color
 | |
| MariaDB T-shirt	NULL
 | |
| Thinkpad Laptop	3 years
 | |
| UPDATE assets
 | |
| SET dynamic_cols=COLUMN_ADD(dynamic_cols, 'warranty', '4 years')
 | |
| WHERE item_name in
 | |
| (select b.item_name from assets b
 | |
| where COLUMN_GET(b.dynamic_cols, 'color' as char) ='black');
 | |
| SELECT item_name,
 | |
| COLUMN_GET(dynamic_cols, 'warranty' as char) AS color
 | |
| FROM assets;
 | |
| item_name	color
 | |
| MariaDB T-shirt	NULL
 | |
| Thinkpad Laptop	4 years
 | |
| UPDATE assets SET dynamic_cols=COLUMN_ADD(dynamic_cols, 'warranty',
 | |
| (select COLUMN_GET(b.dynamic_cols, 'color' as char)
 | |
| from assets b
 | |
| where assets.item_name = item_name));
 | |
| SELECT item_name,
 | |
| COLUMN_GET(dynamic_cols, 'warranty' as char) AS color
 | |
| FROM assets;
 | |
| item_name	color
 | |
| MariaDB T-shirt	blue
 | |
| Thinkpad Laptop	black
 | |
| drop table assets;
 | |
| #
 | |
| # Test on fulltext columns
 | |
| #
 | |
| CREATE TABLE ft2(copy TEXT,FULLTEXT(copy));
 | |
| INSERT INTO ft2(copy) VALUES
 | |
| ('MySQL vs MariaDB database'),
 | |
| ('Oracle vs MariaDB database'),
 | |
| ('PostgreSQL vs MariaDB database'),
 | |
| ('MariaDB overview'),
 | |
| ('Foreign keys'),
 | |
| ('Primary keys'),
 | |
| ('Indexes'),
 | |
| ('Transactions'),
 | |
| ('Triggers');
 | |
| SELECT * FROM ft2 WHERE MATCH(copy) AGAINST('database');
 | |
| copy
 | |
| MySQL vs MariaDB database
 | |
| Oracle vs MariaDB database
 | |
| PostgreSQL vs MariaDB database
 | |
| update ft2 set copy = (select max(concat('mykeyword ',substr(b.copy,1,5)))
 | |
| from ft2 b WHERE MATCH(b.copy) AGAINST('database'))
 | |
| where MATCH(copy) AGAINST('keys');
 | |
| SELECT * FROM ft2 WHERE MATCH(copy) AGAINST('mykeyword');
 | |
| copy
 | |
| mykeyword Postg
 | |
| mykeyword Postg
 | |
| drop table ft2;
 | |
| #######################################
 | |
| #                                     #
 | |
| #            Engine MEMORY            #
 | |
| #                                     #
 | |
| #######################################
 | |
| set default_storage_engine=MEMORY;
 | |
| create table t1 (old_c1 integer,
 | |
| old_c2 integer,
 | |
| c1 integer,
 | |
| c2 integer,
 | |
| c3 integer);
 | |
| create view v1 as select * from t1 where c2=2;
 | |
| create trigger trg_t1 before update on t1 for each row
 | |
| begin
 | |
| set new.old_c1=old.c1;
 | |
| set new.old_c2=old.c2;
 | |
| end;
 | |
| /
 | |
| insert into t1(c1,c2,c3)
 | |
| values (1,1,1), (1,2,2), (1,3,3),
 | |
| (2,1,4), (2,2,5), (2,3,6),
 | |
| (2,4,7), (2,5,8);
 | |
| insert into t1 select NULL, NULL, c1+10,c2,c3+10 from t1;
 | |
| insert into t1 select NULL, NULL, c1+20,c2+1,c3+20 from t1;
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| create table tmp as select * from t1;
 | |
| #######################################
 | |
| #        Test without any index       #
 | |
| #######################################
 | |
| #
 | |
| # Update with value from subquery on the same table
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->5	5	*
 | |
| 2->6	6	*
 | |
| 2->7	7	*
 | |
| 2->8	8	*
 | |
| 11->11	11	 
 | |
| 11->12	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->15	15	*
 | |
| 12->16	16	*
 | |
| 12->17	17	*
 | |
| 12->18	18	*
 | |
| 21->21	21	 
 | |
| 21->22	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->25	25	*
 | |
| 22->26	26	*
 | |
| 22->27	27	*
 | |
| 22->28	28	*
 | |
| 31->31	31	 
 | |
| 31->32	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->35	35	*
 | |
| 32->36	36	*
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + possibly sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| explain select * from t1 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1)
 | |
| update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| affected rows: 3
 | |
| info: Rows matched: 3  Changed: 3  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->10	1	*
 | |
| 1->10	2	*
 | |
| 1->10	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + non-sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; Using filesort
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; Using filesort
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a reference to view in subquery
 | |
| # in settable value
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->3	1	*
 | |
| 1->3	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->4	5	*
 | |
| 2->4	6	*
 | |
| 2->4	7	*
 | |
| 2->4	8	*
 | |
| 11->13	11	*
 | |
| 11->13	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->14	15	*
 | |
| 12->14	16	*
 | |
| 12->14	17	*
 | |
| 12->14	18	*
 | |
| 21->23	21	*
 | |
| 21->23	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->24	25	*
 | |
| 22->24	26	*
 | |
| 22->24	27	*
 | |
| 22->24	28	*
 | |
| 31->33	31	*
 | |
| 31->33	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->34	35	*
 | |
| 32->34	36	*
 | |
| 32->34	37	*
 | |
| 32->34	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| explain select * from v1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| explain update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| affected rows: 7
 | |
| info: Rows matched: 7  Changed: 7  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->17	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| 11->24	12	*
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| 12->27	15	*
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| 21->35	21	*
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| 22->38	24	*
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| 31->45	31	*
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| 32->48	34	*
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| explain select * from v1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| affected rows: 1
 | |
| info: Rows matched: 1  Changed: 1  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with EXISTS and reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| explain select * from v1 where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 3	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->11	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->12	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with IN predicand over the updated table in WHERE
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| explain select * from t1 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1)
 | |
| update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select c3 from t1;
 | |
| c3
 | |
| 111
 | |
| 112
 | |
| 113
 | |
| 114
 | |
| 115
 | |
| 116
 | |
| 117
 | |
| 118
 | |
| 121
 | |
| 122
 | |
| 123
 | |
| 124
 | |
| 125
 | |
| 126
 | |
| 127
 | |
| 128
 | |
| 131
 | |
| 132
 | |
| 133
 | |
| 134
 | |
| 135
 | |
| 136
 | |
| 137
 | |
| 138
 | |
| 141
 | |
| 142
 | |
| 143
 | |
| 144
 | |
| 145
 | |
| 146
 | |
| 147
 | |
| 148
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| explain select * from t1 limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit and an order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| explain select * from t1 order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	Using filesort
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using filesort
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #######################################
 | |
| #          Test with an index         #
 | |
| #######################################
 | |
| create index t1_c2 on t1 (c2,c1);
 | |
| analyze table t1;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Operation failed
 | |
| #
 | |
| # Update with value from subquery on the same table
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Operation failed
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->5	5	*
 | |
| 2->6	6	*
 | |
| 2->7	7	*
 | |
| 2->8	8	*
 | |
| 11->11	11	 
 | |
| 11->12	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->15	15	*
 | |
| 12->16	16	*
 | |
| 12->17	17	*
 | |
| 12->18	18	*
 | |
| 21->21	21	 
 | |
| 21->22	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->25	25	*
 | |
| 22->26	26	*
 | |
| 22->27	27	*
 | |
| 22->28	28	*
 | |
| 31->31	31	 
 | |
| 31->32	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->35	35	*
 | |
| 32->36	36	*
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + possibly sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Operation failed
 | |
| explain select * from t1 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1)
 | |
| update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| affected rows: 3
 | |
| info: Rows matched: 3  Changed: 3  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->10	1	*
 | |
| 1->10	2	*
 | |
| 1->10	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + non-sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Operation failed
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	t1_c2	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	t1_c2	NULL	NULL	NULL	32	
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Operation failed
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where; Using filesort
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	t1_c2	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where; Using filesort
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	t1_c2	NULL	NULL	NULL	32	
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a reference to view in subquery
 | |
| # in settable value
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Operation failed
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	t1	ref	t1_c2	t1_c2	10	const,test.t1.c1	2	
 | |
| update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->3	1	*
 | |
| 1->3	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->4	5	*
 | |
| 2->4	6	*
 | |
| 2->4	7	*
 | |
| 2->4	8	*
 | |
| 11->13	11	*
 | |
| 11->13	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->14	15	*
 | |
| 12->14	16	*
 | |
| 12->14	17	*
 | |
| 12->14	18	*
 | |
| 21->23	21	*
 | |
| 21->23	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->24	25	*
 | |
| 22->24	26	*
 | |
| 22->24	27	*
 | |
| 22->24	28	*
 | |
| 31->33	31	*
 | |
| 31->33	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->34	35	*
 | |
| 32->34	36	*
 | |
| 32->34	37	*
 | |
| 32->34	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Operation failed
 | |
| explain select * from v1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where
 | |
| explain update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| affected rows: 7
 | |
| info: Rows matched: 7  Changed: 7  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->17	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| 11->24	12	*
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| 12->27	15	*
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| 21->35	21	*
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| 22->38	24	*
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| 31->45	31	*
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| 32->48	34	*
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Operation failed
 | |
| explain select * from v1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	t1	ref	t1_c2	t1_c2	10	const,test.t1.c1	2	FirstMatch(t1)
 | |
| explain update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	t1	ref	t1_c2	t1_c2	10	const,func	2	Using where
 | |
| update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| affected rows: 1
 | |
| info: Rows matched: 1  Changed: 1  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with EXISTS and reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Operation failed
 | |
| explain select * from v1 where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where
 | |
| 3	DEPENDENT SUBQUERY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	t1	ref	t1_c2	t1_c2	10	const,test.t1.c1	2	
 | |
| update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->11	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->12	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with IN predicand over the updated table in WHERE
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Operation failed
 | |
| explain select * from t1 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ref	t1_c2	t1_c2	10	test.t1.c2,test.t1.c1	2	FirstMatch(t1)
 | |
| explain update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	t1_c2	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ref	t1_c2	t1_c2	10	test.t1.c2,test.t1.c1	2	FirstMatch(t1)
 | |
| update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select c3 from t1;
 | |
| c3
 | |
| 111
 | |
| 112
 | |
| 113
 | |
| 114
 | |
| 115
 | |
| 116
 | |
| 117
 | |
| 118
 | |
| 121
 | |
| 122
 | |
| 123
 | |
| 124
 | |
| 125
 | |
| 126
 | |
| 127
 | |
| 128
 | |
| 131
 | |
| 132
 | |
| 133
 | |
| 134
 | |
| 135
 | |
| 136
 | |
| 137
 | |
| 138
 | |
| 141
 | |
| 142
 | |
| 143
 | |
| 144
 | |
| 145
 | |
| 146
 | |
| 147
 | |
| 148
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Operation failed
 | |
| explain select * from t1 limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit and an order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Operation failed
 | |
| explain select * from t1 order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	Using filesort
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using filesort
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #######################################
 | |
| #       Test with a primary key       #
 | |
| #######################################
 | |
| drop index t1_c2 on t1;
 | |
| alter table t1 add primary key (c3);
 | |
| analyze table t1;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| #
 | |
| # Update with value from subquery on the same table
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	eq_ref	PRIMARY	PRIMARY	4	test.t1.c3	1	
 | |
| update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->5	5	*
 | |
| 2->6	6	*
 | |
| 2->7	7	*
 | |
| 2->8	8	*
 | |
| 11->11	11	 
 | |
| 11->12	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->15	15	*
 | |
| 12->16	16	*
 | |
| 12->17	17	*
 | |
| 12->18	18	*
 | |
| 21->21	21	 
 | |
| 21->22	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->25	25	*
 | |
| 22->26	26	*
 | |
| 22->27	27	*
 | |
| 22->28	28	*
 | |
| 31->31	31	 
 | |
| 31->32	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->35	35	*
 | |
| 32->36	36	*
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + possibly sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| explain select * from t1 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1)
 | |
| update t1 set c1=10 where c1 <2
 | |
| and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| affected rows: 3
 | |
| info: Rows matched: 3  Changed: 3  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->10	1	*
 | |
| 1->10	2	*
 | |
| 1->10	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with EXISTS subquery over the updated table
 | |
| # in WHERE + non-sargable condition
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| explain select * from t1 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; Using filesort
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; Using filesort
 | |
| 1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 | |
| 2	MATERIALIZED	a	ALL	NULL	NULL	NULL	NULL	32	
 | |
| update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 order by c2;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| 1->11	3	*
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| 2->12	6	*
 | |
| 2->12	7	*
 | |
| 2->12	8	*
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| 11->21	13	*
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| 12->22	16	*
 | |
| 12->22	17	*
 | |
| 12->22	18	*
 | |
| NULL	21	 
 | |
| 21->31	22	*
 | |
| 21->31	23	*
 | |
| NULL	24	 
 | |
| 22->32	25	*
 | |
| 22->32	26	*
 | |
| 22->32	27	*
 | |
| 22->32	28	*
 | |
| NULL	31	 
 | |
| 31->41	32	*
 | |
| 31->41	33	*
 | |
| NULL	34	 
 | |
| 32->42	35	*
 | |
| 32->42	36	*
 | |
| 32->42	37	*
 | |
| 32->42	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a reference to view in subquery
 | |
| # in settable value
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| explain select * from t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update t1 set c1=c1 +(select max(a.c2) from v1 a
 | |
| where a.c1 = t1.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->3	1	*
 | |
| 1->3	2	*
 | |
| 1->3	3	*
 | |
| 2->4	4	*
 | |
| 2->4	5	*
 | |
| 2->4	6	*
 | |
| 2->4	7	*
 | |
| 2->4	8	*
 | |
| 11->13	11	*
 | |
| 11->13	12	*
 | |
| 11->13	13	*
 | |
| 12->14	14	*
 | |
| 12->14	15	*
 | |
| 12->14	16	*
 | |
| 12->14	17	*
 | |
| 12->14	18	*
 | |
| 21->23	21	*
 | |
| 21->23	22	*
 | |
| 21->23	23	*
 | |
| 22->24	24	*
 | |
| 22->24	25	*
 | |
| 22->24	26	*
 | |
| 22->24	27	*
 | |
| 22->24	28	*
 | |
| 31->33	31	*
 | |
| 31->33	32	*
 | |
| 31->33	33	*
 | |
| 32->34	34	*
 | |
| 32->34	35	*
 | |
| 32->34	36	*
 | |
| 32->34	37	*
 | |
| 32->34	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| explain select * from v1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| explain update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	PRIMARY	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	a	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1 set c1=c1 + (select max(a.c2) from t1 a
 | |
| where a.c1 = v1.c1) +10 where c3 > 3;
 | |
| affected rows: 7
 | |
| info: Rows matched: 7  Changed: 7  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->17	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| 11->24	12	*
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| 12->27	15	*
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| 21->35	21	*
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| 22->38	24	*
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| 31->45	31	*
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| 32->48	34	*
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| explain select * from v1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1 set c1=c1 + 1 where c1 <2
 | |
| and exists (select 'X' from v1 a where a.c1 = v1.c1);
 | |
| affected rows: 1
 | |
| info: Rows matched: 1  Changed: 1  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update view with EXISTS and reference to the same view in subquery
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| explain select * from v1 where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 3	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| 2	DEPENDENT SUBQUERY	t1	ALL	NULL	NULL	NULL	NULL	32	Using where
 | |
| update v1
 | |
| set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
 | |
| where c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| 1->11	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| 2->12	5	*
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with IN predicand over the updated table in WHERE
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| explain select * from t1 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1); Using join buffer (flat, BNL join)
 | |
| explain update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	32	Using where; FirstMatch(t1)
 | |
| update t1 set c3=c3+110 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
 | |
| affected rows: 32
 | |
| info: Rows matched: 32  Changed: 32  Warnings: 0
 | |
| select c3 from t1;
 | |
| c3
 | |
| 111
 | |
| 112
 | |
| 113
 | |
| 114
 | |
| 115
 | |
| 116
 | |
| 117
 | |
| 118
 | |
| 121
 | |
| 122
 | |
| 123
 | |
| 124
 | |
| 125
 | |
| 126
 | |
| 127
 | |
| 128
 | |
| 131
 | |
| 132
 | |
| 133
 | |
| 134
 | |
| 135
 | |
| 136
 | |
| 137
 | |
| 138
 | |
| 141
 | |
| 142
 | |
| 143
 | |
| 144
 | |
| 145
 | |
| 146
 | |
| 147
 | |
| 148
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| explain select * from t1 limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	
 | |
| 2	DEPENDENT SUBQUERY	a	eq_ref	PRIMARY	PRIMARY	4	test.t1.c3	1	
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| 1->1	1	 
 | |
| 1->2	2	*
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| NULL	37	 
 | |
| NULL	38	 
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Update with a limit and an order by
 | |
| #
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	note	The storage engine for the table doesn't support analyze
 | |
| explain select * from t1 order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	32	Using filesort
 | |
| explain update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	32	Using filesort
 | |
| 2	DEPENDENT SUBQUERY	a	eq_ref	PRIMARY	PRIMARY	4	test.t1.c3	1	
 | |
| update t1
 | |
| set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
 | |
| order by c3 desc limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select concat(old_c1,'->',c1),c3,
 | |
| case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
 | |
| concat(old_c1,'->',c1)	c3	Changed
 | |
| NULL	1	 
 | |
| NULL	2	 
 | |
| NULL	3	 
 | |
| NULL	4	 
 | |
| NULL	5	 
 | |
| NULL	6	 
 | |
| NULL	7	 
 | |
| NULL	8	 
 | |
| NULL	11	 
 | |
| NULL	12	 
 | |
| NULL	13	 
 | |
| NULL	14	 
 | |
| NULL	15	 
 | |
| NULL	16	 
 | |
| NULL	17	 
 | |
| NULL	18	 
 | |
| NULL	21	 
 | |
| NULL	22	 
 | |
| NULL	23	 
 | |
| NULL	24	 
 | |
| NULL	25	 
 | |
| NULL	26	 
 | |
| NULL	27	 
 | |
| NULL	28	 
 | |
| NULL	31	 
 | |
| NULL	32	 
 | |
| NULL	33	 
 | |
| NULL	34	 
 | |
| NULL	35	 
 | |
| NULL	36	 
 | |
| 32->37	37	*
 | |
| 32->38	38	*
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Update with error "Subquery returns more than 1 row"
 | |
| update t1 set c2=(select c2 from t1);
 | |
| ERROR 21000: Subquery returns more than 1 row
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| # Update with error "Subquery returns more than 1 row"
 | |
| # and order by
 | |
| update t1 set c2=(select c2 from t1) order by c3;
 | |
| ERROR 21000: Subquery returns more than 1 row
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| # Duplicate value on update a primary key
 | |
| update t1 set c3=0
 | |
| where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| ERROR 23000: Duplicate entry '0' for key 'PRIMARY'
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	0
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Duplicate value on update a primary key with ignore
 | |
| update ignore t1 set c3=0
 | |
| where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
 | |
| affected rows: 20
 | |
| info: Rows matched: 20  Changed: 20  Warnings: 0
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	0
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Duplicate value on update a primary key and limit
 | |
| update t1 set c3=0
 | |
| where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 limit 2;
 | |
| ERROR 23000: Duplicate entry '0' for key 'PRIMARY'
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	0
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Duplicate value on update a primary key with ignore
 | |
| # and limit
 | |
| update ignore t1 set c3=0
 | |
| where exists (select 'X' from t1 a where a.c2 = t1.c2)
 | |
| and c2 >= 3 limit 2;
 | |
| affected rows: 2
 | |
| info: Rows matched: 2  Changed: 2  Warnings: 0
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	0
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Update no rows found
 | |
| update t1 set c1=10
 | |
| where c1 <2 and exists (select 'X' from t1 a where a.c1 = t1.c1 + 10);
 | |
| affected rows: 3
 | |
| info: Rows matched: 3  Changed: 3  Warnings: 0
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 10	1	1
 | |
| 10	2	2
 | |
| 10	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| # Update no rows changed
 | |
| drop trigger trg_t1;
 | |
| update t1 set c1=c1
 | |
| where c1 <2 and exists (select 'X' from t1 a where a.c1 = t1.c1);
 | |
| affected rows: 0
 | |
| info: Rows matched: 3  Changed: 0  Warnings: 0
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Check call of after trigger
 | |
| #
 | |
| create or replace trigger trg_t2 after update on t1 for each row
 | |
| begin
 | |
| declare msg varchar(100);
 | |
| if (new.c3 = 5) then
 | |
| set msg=concat('in after update trigger on ',new.c3);
 | |
| SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
 | |
| end if;
 | |
| end;
 | |
| /
 | |
| update t1 set c1=2
 | |
| where c3 in (select distinct a.c3 from t1 a where a.c1=t1.c1);
 | |
| ERROR 45000: in after update trigger on 5
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	1
 | |
| 2	1	4
 | |
| 2	2	2
 | |
| 2	2	5
 | |
| 2	3	3
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| #
 | |
| # Check update with order by and after trigger
 | |
| #
 | |
| update t1 set c1=2
 | |
| where c3 in (select distinct a.c3 from t1 a where a.c1=t1.c1)
 | |
| order by t1.c2, t1.c1;
 | |
| ERROR 45000: in after update trigger on 5
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	3	3
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	1
 | |
| 2	1	11
 | |
| 2	1	14
 | |
| 2	1	4
 | |
| 2	2	2
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| drop view v1;
 | |
| #
 | |
| # Check update on view with check option
 | |
| #
 | |
| create view v1 as select * from t1 where c2=2 with check option;
 | |
| update v1 set c2=3 where c1=1;
 | |
| ERROR 44000: CHECK OPTION failed `test`.`v1`
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| update v1 set c2=(select max(c3) from v1) where c1=1;
 | |
| ERROR 44000: CHECK OPTION failed `test`.`v1`
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 1	1	1
 | |
| 1	2	2
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| update v1 set c2=(select min(va.c3) from v1 va), c1=0 where c1=1;
 | |
| select c1,c2,c3 from t1;
 | |
| c1	c2	c3
 | |
| 0	2	2
 | |
| 1	1	1
 | |
| 1	3	3
 | |
| 11	1	11
 | |
| 11	2	12
 | |
| 11	3	13
 | |
| 12	1	14
 | |
| 12	2	15
 | |
| 12	3	16
 | |
| 12	4	17
 | |
| 12	5	18
 | |
| 2	1	4
 | |
| 2	2	5
 | |
| 2	3	6
 | |
| 2	4	7
 | |
| 2	5	8
 | |
| 21	2	21
 | |
| 21	3	22
 | |
| 21	4	23
 | |
| 22	2	24
 | |
| 22	3	25
 | |
| 22	4	26
 | |
| 22	5	27
 | |
| 22	6	28
 | |
| 31	2	31
 | |
| 31	3	32
 | |
| 31	4	33
 | |
| 32	2	34
 | |
| 32	3	35
 | |
| 32	4	36
 | |
| 32	5	37
 | |
| 32	6	38
 | |
| truncate table t1;
 | |
| insert into t1 select * from tmp;
 | |
| drop table tmp;
 | |
| drop view v1;
 | |
| drop table t1;
 | |
| set @@default_storage_engine=@save_default_engine;
 | |
| #
 | |
| # Test with MyISAM
 | |
| #
 | |
| create table t1 (old_c1 integer,
 | |
| old_c2 integer,
 | |
| c1 integer,
 | |
| c2 integer,
 | |
| c3 integer) engine=MyISAM;
 | |
| insert t1 (c1,c2,c3) select 0,seq,seq%10 from seq_1_to_500;
 | |
| insert t1 (c1,c2,c3) select 1,seq,seq%10 from seq_1_to_400;
 | |
| insert t1 (c1,c2,c3) select 2,seq,seq%10 from seq_1_to_300;
 | |
| insert t1 (c1,c2,c3) select 3,seq,seq%10 from seq_1_to_200;
 | |
| create index t1_idx1 on t1(c3);
 | |
| analyze table t1;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	Table is already up to date
 | |
| update t1 set c1=2 where exists (select 'x' from t1);
 | |
| select count(*) from t1 where c1=2;
 | |
| count(*)
 | |
| 1400
 | |
| update t1 set c1=3 where c3 in (select c3 from t1 b where t1.c3=b.c1);
 | |
| select count(*) from t1 where c1=3;
 | |
| count(*)
 | |
| 140
 | |
| drop table t1;
 | |
| #
 | |
| # Test error on multi_update conversion on view
 | |
| # with order by or limit
 | |
| #
 | |
| create table t1 (c1 integer) engine=InnoDb;
 | |
| create table t2 (c1 integer) engine=InnoDb;
 | |
| create view v1 as select t1.c1 as "t1c1" ,t2.c1 as "t2c1"
 | |
|         from t1,t2 where t1.c1=t2.c1;
 | |
| update v1 set t1c1=2 order by 1;
 | |
| update v1 set t1c1=2 limit 1;
 | |
| drop table t1;
 | |
| drop table t2;
 | |
| drop view v1;
 | 
