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->11 1->22 * 1->33 * 2->44 * 2->55 * 2->66 * 2->77 * 2->88 * 11->1111 11->1212 * 11->1313 * 12->1414 * 12->1515 * 12->1616 * 12->1717 * 12->1818 * 21->2121 21->2222 * 21->2323 * 22->2424 * 22->2525 * 22->2626 * 22->2727 * 22->2828 * 31->3131 31->3232 * 31->3333 * 32->3434 * 32->3535 * 32->3636 * 32->3737 * 32->3838 *
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->101 * 1->102 * 1->103 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->31 * 1->32 * 1->33 * 2->44 * 2->45 * 2->46 * 2->47 * 2->48 * 11->1311 * 11->1312 * 11->1313 * 12->1414 * 12->1415 * 12->1416 * 12->1417 * 12->1418 * 21->2321 * 21->2322 * 21->2323 * 22->2424 * 22->2425 * 22->2426 * 22->2427 * 22->2428 * 31->3331 * 31->3332 * 31->3333 * 32->3434 * 32->3435 * 32->3436 * 32->3437 * 32->3438 *
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->175 *
NULL 6
NULL 7
NULL 8
NULL 11 11->2412 *
NULL 13
NULL 14 12->2715 *
NULL 16
NULL 17
NULL 18 21->3521 *
NULL 22
NULL 23 22->3824 *
NULL 25
NULL 26
NULL 27
NULL 28 31->4531 *
NULL 32
NULL 33 32->4834 *
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->22 *
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 <10and 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 <10and 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 <10and 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->112 *
NULL 3
NULL 4 2->125 *
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->11 1->22 *
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->3737 * 32->3838 *
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->11 1->22 * 1->33 * 2->44 * 2->55 * 2->66 * 2->77 * 2->88 * 11->1111 11->1212 * 11->1313 * 12->1414 * 12->1515 * 12->1616 * 12->1717 * 12->1818 * 21->2121 21->2222 * 21->2323 * 22->2424 * 22->2525 * 22->2626 * 22->2727 * 22->2828 * 31->3131 31->3232 * 31->3333 * 32->3434 * 32->3535 * 32->3636 * 32->3737 * 32->3838 *
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->101 * 1->102 * 1->103 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->31 * 1->32 * 1->33 * 2->44 * 2->45 * 2->46 * 2->47 * 2->48 * 11->1311 * 11->1312 * 11->1313 * 12->1414 * 12->1415 * 12->1416 * 12->1417 * 12->1418 * 21->2321 * 21->2322 * 21->2323 * 22->2424 * 22->2425 * 22->2426 * 22->2427 * 22->2428 * 31->3331 * 31->3332 * 31->3333 * 32->3434 * 32->3435 * 32->3436 * 32->3437 * 32->3438 *
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->175 *
NULL 6
NULL 7
NULL 8
NULL 11 11->2412 *
NULL 13
NULL 14 12->2715 *
NULL 16
NULL 17
NULL 18 21->3521 *
NULL 22
NULL 23 22->3824 *
NULL 25
NULL 26
NULL 27
NULL 28 31->4531 *
NULL 32
NULL 33 32->4834 *
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->22 *
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 <10and 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 <10and 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 <10and 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->112 *
NULL 3
NULL 4 2->125 *
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->11 1->22 *
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->3737 * 32->3838 *
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->11 1->22 * 1->33 * 2->44 * 2->55 * 2->66 * 2->77 * 2->88 * 11->1111 11->1212 * 11->1313 * 12->1414 * 12->1515 * 12->1616 * 12->1717 * 12->1818 * 21->2121 21->2222 * 21->2323 * 22->2424 * 22->2525 * 22->2626 * 22->2727 * 22->2828 * 31->3131 31->3232 * 31->3333 * 32->3434 * 32->3535 * 32->3636 * 32->3737 * 32->3838 *
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->101 * 1->102 * 1->103 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->31 * 1->32 * 1->33 * 2->44 * 2->45 * 2->46 * 2->47 * 2->48 * 11->1311 * 11->1312 * 11->1313 * 12->1414 * 12->1415 * 12->1416 * 12->1417 * 12->1418 * 21->2321 * 21->2322 * 21->2323 * 22->2424 * 22->2425 * 22->2426 * 22->2427 * 22->2428 * 31->3331 * 31->3332 * 31->3333 * 32->3434 * 32->3435 * 32->3436 * 32->3437 * 32->3438 *
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->175 *
NULL 6
NULL 7
NULL 8
NULL 11 11->2412 *
NULL 13
NULL 14 12->2715 *
NULL 16
NULL 17
NULL 18 21->3521 *
NULL 22
NULL 23 22->3824 *
NULL 25
NULL 26
NULL 27
NULL 28 31->4531 *
NULL 32
NULL 33 32->4834 *
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->22 *
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 <10and 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 <10and 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 <10and 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->112 *
NULL 3
NULL 4 2->125 *
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->11 1->22 *
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->3737 * 32->3838 *
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); ERROR21000: Subquery returns more than 1 row
select c1,c2,c3 from t1;
c1 c2 c3 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
# Update with error"Subquery returns more than 1 row"
# and order by
update t1 set c2=(select c2 from t1) order by c3; ERROR21000: Subquery returns more than 1 row
select c1,c2,c3 from t1;
c1 c2 c3 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
# 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; ERROR23000: Duplicate entry '0' for key 'PRIMARY'
select c1,c2,c3 from t1;
c1 c2 c3 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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 111 122 130 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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; ERROR23000: Duplicate entry '0' for key 'PRIMARY'
select c1,c2,c3 from t1;
c1 c2 c3 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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 111 122 130 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
truncate table t1;
insert into t1 select * from tmp;
# Update no rows found
update t1 set c1=10
where c1 <2and 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 1011 1022 1033 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
truncate table t1;
insert into t1 select * from tmp;
# Update no rows changed
drop trigger trg_t1;
update t1 set c1=c1
where c1 <2and 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 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
truncate table t1;
insert into t1 select * from tmp;
#
# Check call of after trigger
#
create orreplace 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); ERROR45000: in after update trigger on 5
select c1,c2,c3 from t1;
c1 c2 c3 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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; ERROR45000: in after update trigger on 5
select c1,c2,c3 from t1;
c1 c2 c3 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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; ERROR44000: CHECK OPTION failed `test`.`v1`
select c1,c2,c3 from t1;
c1 c2 c3 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
truncate table t1;
insert into t1 select * from tmp;
update v1 set c2=(select max(c3) from v1) where c1=1; ERROR44000: CHECK OPTION failed `test`.`v1`
select c1,c2,c3 from t1;
c1 c2 c3 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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 022 111 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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->11 1->22 * 1->33 * 2->44 * 2->55 * 2->66 * 2->77 * 2->88 * 11->1111 11->1212 * 11->1313 * 12->1414 * 12->1515 * 12->1616 * 12->1717 * 12->1818 * 21->2121 21->2222 * 21->2323 * 22->2424 * 22->2525 * 22->2626 * 22->2727 * 22->2828 * 31->3131 31->3232 * 31->3333 * 32->3434 * 32->3535 * 32->3636 * 32->3737 * 32->3838 *
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->101 * 1->102 * 1->103 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->31 * 1->32 * 1->33 * 2->44 * 2->45 * 2->46 * 2->47 * 2->48 * 11->1311 * 11->1312 * 11->1313 * 12->1414 * 12->1415 * 12->1416 * 12->1417 * 12->1418 * 21->2321 * 21->2322 * 21->2323 * 22->2424 * 22->2425 * 22->2426 * 22->2427 * 22->2428 * 31->3331 * 31->3332 * 31->3333 * 32->3434 * 32->3435 * 32->3436 * 32->3437 * 32->3438 *
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->175 *
NULL 6
NULL 7
NULL 8
NULL 11 11->2412 *
NULL 13
NULL 14 12->2715 *
NULL 16
NULL 17
NULL 18 21->3521 *
NULL 22
NULL 23 22->3824 *
NULL 25
NULL 26
NULL 27
NULL 28 31->4531 *
NULL 32
NULL 33 32->4834 *
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->22 *
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 <10and 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 <10and 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 <10and 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->112 *
NULL 3
NULL 4 2->125 *
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->11 1->22 *
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->3737 * 32->3838 *
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->11 1->22 * 1->33 * 2->44 * 2->55 * 2->66 * 2->77 * 2->88 * 11->1111 11->1212 * 11->1313 * 12->1414 * 12->1515 * 12->1616 * 12->1717 * 12->1818 * 21->2121 21->2222 * 21->2323 * 22->2424 * 22->2525 * 22->2626 * 22->2727 * 22->2828 * 31->3131 31->3232 * 31->3333 * 32->3434 * 32->3535 * 32->3636 * 32->3737 * 32->3838 *
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->101 * 1->102 * 1->103 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->31 * 1->32 * 1->33 * 2->44 * 2->45 * 2->46 * 2->47 * 2->48 * 11->1311 * 11->1312 * 11->1313 * 12->1414 * 12->1415 * 12->1416 * 12->1417 * 12->1418 * 21->2321 * 21->2322 * 21->2323 * 22->2424 * 22->2425 * 22->2426 * 22->2427 * 22->2428 * 31->3331 * 31->3332 * 31->3333 * 32->3434 * 32->3435 * 32->3436 * 32->3437 * 32->3438 *
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->175 *
NULL 6
NULL 7
NULL 8
NULL 11 11->2412 *
NULL 13
NULL 14 12->2715 *
NULL 16
NULL 17
NULL 18 21->3521 *
NULL 22
NULL 23 22->3824 *
NULL 25
NULL 26
NULL 27
NULL 28 31->4531 *
NULL 32
NULL 33 32->4834 *
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->22 *
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 <10and 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 <10and 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 <10and 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->112 *
NULL 3
NULL 4 2->125 *
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->11 1->22 *
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->3737 * 32->3838 *
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->11 1->22 * 1->33 * 2->44 * 2->55 * 2->66 * 2->77 * 2->88 * 11->1111 11->1212 * 11->1313 * 12->1414 * 12->1515 * 12->1616 * 12->1717 * 12->1818 * 21->2121 21->2222 * 21->2323 * 22->2424 * 22->2525 * 22->2626 * 22->2727 * 22->2828 * 31->3131 31->3232 * 31->3333 * 32->3434 * 32->3535 * 32->3636 * 32->3737 * 32->3838 *
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->101 * 1->102 * 1->103 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->31 * 1->32 * 1->33 * 2->44 * 2->45 * 2->46 * 2->47 * 2->48 * 11->1311 * 11->1312 * 11->1313 * 12->1414 * 12->1415 * 12->1416 * 12->1417 * 12->1418 * 21->2321 * 21->2322 * 21->2323 * 22->2424 * 22->2425 * 22->2426 * 22->2427 * 22->2428 * 31->3331 * 31->3332 * 31->3333 * 32->3434 * 32->3435 * 32->3436 * 32->3437 * 32->3438 *
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->175 *
NULL 6
NULL 7
NULL 8
NULL 11 11->2412 *
NULL 13
NULL 14 12->2715 *
NULL 16
NULL 17
NULL 18 21->3521 *
NULL 22
NULL 23 22->3824 *
NULL 25
NULL 26
NULL 27
NULL 28 31->4531 *
NULL 32
NULL 33 32->4834 *
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->22 *
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 <10and 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 <10and 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 <10and 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->112 *
NULL 3
NULL 4 2->125 *
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->11 1->22 *
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->3737 * 32->3838 *
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); ERROR21000: Subquery returns more than 1 row
select c1,c2,c3 from t1;
c1 c2 c3 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
# Update with error"Subquery returns more than 1 row"
# and order by
update t1 set c2=(select c2 from t1) order by c3; ERROR21000: Subquery returns more than 1 row
select c1,c2,c3 from t1;
c1 c2 c3 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
# 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; ERROR23000: Duplicate entry '0' for key 'PRIMARY'
select c1,c2,c3 from t1;
c1 c2 c3 111 122 130 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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 111 122 130 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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; ERROR23000: Duplicate entry '0' for key 'PRIMARY'
select c1,c2,c3 from t1;
c1 c2 c3 111 122 130 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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 111 122 130 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
truncate table t1;
insert into t1 select * from tmp;
# Update no rows found
update t1 set c1=10
where c1 <2and 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 1011 1022 1033 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
truncate table t1;
insert into t1 select * from tmp;
# Update no rows changed
drop trigger trg_t1;
update t1 set c1=c1
where c1 <2and 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 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
truncate table t1;
insert into t1 select * from tmp;
#
# Check call of after trigger
#
create orreplace 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); ERROR45000: in after update trigger on 5
select c1,c2,c3 from t1;
c1 c2 c3 11111 11212 11313 12114 12215 12316 12417 12518 211 214 222 225 233 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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; ERROR45000: in after update trigger on 5
select c1,c2,c3 from t1;
c1 c2 c3 133 11212 11313 12215 12316 12417 12518 211 2111 2114 214 222 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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; ERROR44000: CHECK OPTION failed `test`.`v1`
select c1,c2,c3 from t1;
c1 c2 c3 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
truncate table t1;
insert into t1 select * from tmp;
update v1 set c2=(select max(c3) from v1) where c1=1; ERROR44000: CHECK OPTION failed `test`.`v1`
select c1,c2,c3 from t1;
c1 c2 c3 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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 022 111 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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->11 1->22 * 1->33 * 2->44 * 2->55 * 2->66 * 2->77 * 2->88 * 11->1111 11->1212 * 11->1313 * 12->1414 * 12->1515 * 12->1616 * 12->1717 * 12->1818 * 21->2121 21->2222 * 21->2323 * 22->2424 * 22->2525 * 22->2626 * 22->2727 * 22->2828 * 31->3131 31->3232 * 31->3333 * 32->3434 * 32->3535 * 32->3636 * 32->3737 * 32->3838 *
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->101 * 1->102 * 1->103 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->31 * 1->32 * 1->33 * 2->44 * 2->45 * 2->46 * 2->47 * 2->48 * 11->1311 * 11->1312 * 11->1313 * 12->1414 * 12->1415 * 12->1416 * 12->1417 * 12->1418 * 21->2321 * 21->2322 * 21->2323 * 22->2424 * 22->2425 * 22->2426 * 22->2427 * 22->2428 * 31->3331 * 31->3332 * 31->3333 * 32->3434 * 32->3435 * 32->3436 * 32->3437 * 32->3438 *
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->175 *
NULL 6
NULL 7
NULL 8
NULL 11 11->2412 *
NULL 13
NULL 14 12->2715 *
NULL 16
NULL 17
NULL 18 21->3521 *
NULL 22
NULL 23 22->3824 *
NULL 25
NULL 26
NULL 27
NULL 28 31->4531 *
NULL 32
NULL 33 32->4834 *
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->22 *
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 <10and 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 <10and 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 <10and 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->112 *
NULL 3
NULL 4 2->125 *
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->11 1->22 *
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->3737 * 32->3838 *
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->11 1->22 * 1->33 * 2->44 * 2->55 * 2->66 * 2->77 * 2->88 * 11->1111 11->1212 * 11->1313 * 12->1414 * 12->1515 * 12->1616 * 12->1717 * 12->1818 * 21->2121 21->2222 * 21->2323 * 22->2424 * 22->2525 * 22->2626 * 22->2727 * 22->2828 * 31->3131 31->3232 * 31->3333 * 32->3434 * 32->3535 * 32->3636 * 32->3737 * 32->3838 *
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->101 * 1->102 * 1->103 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->31 * 1->32 * 1->33 * 2->44 * 2->45 * 2->46 * 2->47 * 2->48 * 11->1311 * 11->1312 * 11->1313 * 12->1414 * 12->1415 * 12->1416 * 12->1417 * 12->1418 * 21->2321 * 21->2322 * 21->2323 * 22->2424 * 22->2425 * 22->2426 * 22->2427 * 22->2428 * 31->3331 * 31->3332 * 31->3333 * 32->3434 * 32->3435 * 32->3436 * 32->3437 * 32->3438 *
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->175 *
NULL 6
NULL 7
NULL 8
NULL 11 11->2412 *
NULL 13
NULL 14 12->2715 *
NULL 16
NULL 17
NULL 18 21->3521 *
NULL 22
NULL 23 22->3824 *
NULL 25
NULL 26
NULL 27
NULL 28 31->4531 *
NULL 32
NULL 33 32->4834 *
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->22 *
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 <10and 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 <10and 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 <10and 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->112 *
NULL 3
NULL 4 2->125 *
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->11 1->22 *
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->3737 * 32->3838 *
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->11 1->22 * 1->33 * 2->44 * 2->55 * 2->66 * 2->77 * 2->88 * 11->1111 11->1212 * 11->1313 * 12->1414 * 12->1515 * 12->1616 * 12->1717 * 12->1818 * 21->2121 21->2222 * 21->2323 * 22->2424 * 22->2525 * 22->2626 * 22->2727 * 22->2828 * 31->3131 31->3232 * 31->3333 * 32->3434 * 32->3535 * 32->3636 * 32->3737 * 32->3838 *
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->101 * 1->102 * 1->103 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->31 * 1->32 * 1->33 * 2->44 * 2->45 * 2->46 * 2->47 * 2->48 * 11->1311 * 11->1312 * 11->1313 * 12->1414 * 12->1415 * 12->1416 * 12->1417 * 12->1418 * 21->2321 * 21->2322 * 21->2323 * 22->2424 * 22->2425 * 22->2426 * 22->2427 * 22->2428 * 31->3331 * 31->3332 * 31->3333 * 32->3434 * 32->3435 * 32->3436 * 32->3437 * 32->3438 *
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->175 *
NULL 6
NULL 7
NULL 8
NULL 11 11->2412 *
NULL 13
NULL 14 12->2715 *
NULL 16
NULL 17
NULL 18 21->3521 *
NULL 22
NULL 23 22->3824 *
NULL 25
NULL 26
NULL 27
NULL 28 31->4531 *
NULL 32
NULL 33 32->4834 *
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->22 *
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 <10and 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 <10and 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 <10and 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->112 *
NULL 3
NULL 4 2->125 *
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->11 1->22 *
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->3737 * 32->3838 *
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); ERROR21000: Subquery returns more than 1 row
select c1,c2,c3 from t1;
c1 c2 c3 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
# Update with error"Subquery returns more than 1 row"
# and order by
update t1 set c2=(select c2 from t1) order by c3; ERROR21000: Subquery returns more than 1 row
select c1,c2,c3 from t1;
c1 c2 c3 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
# 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; ERROR23000: Duplicate entry '0' for key 'PRIMARY'
select c1,c2,c3 from t1;
c1 c2 c3 111 122 130 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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 111 122 130 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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; ERROR23000: Duplicate entry '0' for key 'PRIMARY'
select c1,c2,c3 from t1;
c1 c2 c3 111 122 130 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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 111 122 130 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
truncate table t1;
insert into t1 select * from tmp;
# Update no rows found
update t1 set c1=10
where c1 <2and 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 1011 1022 1033 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
truncate table t1;
insert into t1 select * from tmp;
# Update no rows changed
drop trigger trg_t1;
update t1 set c1=c1
where c1 <2and 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 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
truncate table t1;
insert into t1 select * from tmp;
#
# Check call of after trigger
#
create orreplace 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); ERROR45000: in after update trigger on 5
select c1,c2,c3 from t1;
c1 c2 c3 11111 11212 11313 12114 12215 12316 12417 12518 211 214 222 225 233 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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; ERROR45000: in after update trigger on 5
select c1,c2,c3 from t1;
c1 c2 c3 133 11212 11313 12215 12316 12417 12518 211 2111 2114 214 222 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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; ERROR44000: CHECK OPTION failed `test`.`v1`
select c1,c2,c3 from t1;
c1 c2 c3 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
truncate table t1;
insert into t1 select * from tmp;
update v1 set c2=(select max(c3) from v1) where c1=1; ERROR44000: CHECK OPTION failed `test`.`v1`
select c1,c2,c3 from t1;
c1 c2 c3 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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 022 111 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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->11 1->22 * 1->33 * 2->44 * 2->55 * 2->66 * 2->77 * 2->88 * 11->1111 11->1212 * 11->1313 * 12->1414 * 12->1515 * 12->1616 * 12->1717 * 12->1818 * 21->2121 21->2222 * 21->2323 * 22->2424 * 22->2525 * 22->2626 * 22->2727 * 22->2828 * 31->3131 31->3232 * 31->3333 * 32->3434 * 32->3535 * 32->3636 * 32->3737 * 32->3838 *
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->101 * 1->102 * 1->103 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->31 * 1->32 * 1->33 * 2->44 * 2->45 * 2->46 * 2->47 * 2->48 * 11->1311 * 11->1312 * 11->1313 * 12->1414 * 12->1415 * 12->1416 * 12->1417 * 12->1418 * 21->2321 * 21->2322 * 21->2323 * 22->2424 * 22->2425 * 22->2426 * 22->2427 * 22->2428 * 31->3331 * 31->3332 * 31->3333 * 32->3434 * 32->3435 * 32->3436 * 32->3437 * 32->3438 *
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->175 *
NULL 6
NULL 7
NULL 8
NULL 11 11->2412 *
NULL 13
NULL 14 12->2715 *
NULL 16
NULL 17
NULL 18 21->3521 *
NULL 22
NULL 23 22->3824 *
NULL 25
NULL 26
NULL 27
NULL 28 31->4531 *
NULL 32
NULL 33 32->4834 *
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->22 *
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 <10and 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 <10and 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 <10and 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->112 *
NULL 3
NULL 4 2->125 *
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->11 1->22 *
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->3737 * 32->3838 *
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->11 1->22 * 1->33 * 2->44 * 2->55 * 2->66 * 2->77 * 2->88 * 11->1111 11->1212 * 11->1313 * 12->1414 * 12->1515 * 12->1616 * 12->1717 * 12->1818 * 21->2121 21->2222 * 21->2323 * 22->2424 * 22->2525 * 22->2626 * 22->2727 * 22->2828 * 31->3131 31->3232 * 31->3333 * 32->3434 * 32->3535 * 32->3636 * 32->3737 * 32->3838 *
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->101 * 1->102 * 1->103 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->31 * 1->32 * 1->33 * 2->44 * 2->45 * 2->46 * 2->47 * 2->48 * 11->1311 * 11->1312 * 11->1313 * 12->1414 * 12->1415 * 12->1416 * 12->1417 * 12->1418 * 21->2321 * 21->2322 * 21->2323 * 22->2424 * 22->2425 * 22->2426 * 22->2427 * 22->2428 * 31->3331 * 31->3332 * 31->3333 * 32->3434 * 32->3435 * 32->3436 * 32->3437 * 32->3438 *
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->175 *
NULL 6
NULL 7
NULL 8
NULL 11 11->2412 *
NULL 13
NULL 14 12->2715 *
NULL 16
NULL 17
NULL 18 21->3521 *
NULL 22
NULL 23 22->3824 *
NULL 25
NULL 26
NULL 27
NULL 28 31->4531 *
NULL 32
NULL 33 32->4834 *
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->22 *
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 <10and 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 <10and 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 <10and 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->112 *
NULL 3
NULL 4 2->125 *
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->11 1->22 *
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->3737 * 32->3838 *
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->11 1->22 * 1->33 * 2->44 * 2->55 * 2->66 * 2->77 * 2->88 * 11->1111 11->1212 * 11->1313 * 12->1414 * 12->1515 * 12->1616 * 12->1717 * 12->1818 * 21->2121 21->2222 * 21->2323 * 22->2424 * 22->2525 * 22->2626 * 22->2727 * 22->2828 * 31->3131 31->3232 * 31->3333 * 32->3434 * 32->3535 * 32->3636 * 32->3737 * 32->3838 *
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->101 * 1->102 * 1->103 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->113 *
NULL 4
NULL 5 2->126 * 2->127 * 2->128 *
NULL 11
NULL 12 11->2113 *
NULL 14
NULL 15 12->2216 * 12->2217 * 12->2218 *
NULL 21 21->3122 * 21->3123 *
NULL 24 22->3225 * 22->3226 * 22->3227 * 22->3228 *
NULL 31 31->4132 * 31->4133 *
NULL 34 32->4235 * 32->4236 * 32->4237 * 32->4238 *
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->31 * 1->32 * 1->33 * 2->44 * 2->45 * 2->46 * 2->47 * 2->48 * 11->1311 * 11->1312 * 11->1313 * 12->1414 * 12->1415 * 12->1416 * 12->1417 * 12->1418 * 21->2321 * 21->2322 * 21->2323 * 22->2424 * 22->2425 * 22->2426 * 22->2427 * 22->2428 * 31->3331 * 31->3332 * 31->3333 * 32->3434 * 32->3435 * 32->3436 * 32->3437 * 32->3438 *
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->175 *
NULL 6
NULL 7
NULL 8
NULL 11 11->2412 *
NULL 13
NULL 14 12->2715 *
NULL 16
NULL 17
NULL 18 21->3521 *
NULL 22
NULL 23 22->3824 *
NULL 25
NULL 26
NULL 27
NULL 28 31->4531 *
NULL 32
NULL 33 32->4834 *
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->22 *
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 <10and 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 <10and 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 <10and 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->112 *
NULL 3
NULL 4 2->125 *
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->11 1->22 *
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->3737 * 32->3838 *
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); ERROR21000: Subquery returns more than 1 row
select c1,c2,c3 from t1;
c1 c2 c3 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
# Update with error"Subquery returns more than 1 row"
# and order by
update t1 set c2=(select c2 from t1) order by c3; ERROR21000: Subquery returns more than 1 row
select c1,c2,c3 from t1;
c1 c2 c3 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
# 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; ERROR23000: Duplicate entry '0' for key 'PRIMARY'
select c1,c2,c3 from t1;
c1 c2 c3 111 122 130 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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 111 122 130 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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; ERROR23000: Duplicate entry '0' for key 'PRIMARY'
select c1,c2,c3 from t1;
c1 c2 c3 111 122 130 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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 111 122 130 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
truncate table t1;
insert into t1 select * from tmp;
# Update no rows found
update t1 set c1=10
where c1 <2and 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 1011 1022 1033 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
truncate table t1;
insert into t1 select * from tmp;
# Update no rows changed
drop trigger trg_t1;
update t1 set c1=c1
where c1 <2and 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 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
truncate table t1;
insert into t1 select * from tmp;
#
# Check call of after trigger
#
create orreplace 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); ERROR45000: in after update trigger on 5
select c1,c2,c3 from t1;
c1 c2 c3 11111 11212 11313 12114 12215 12316 12417 12518 211 214 222 225 233 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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; ERROR45000: in after update trigger on 5
select c1,c2,c3 from t1;
c1 c2 c3 133 11212 11313 12215 12316 12417 12518 211 2111 2114 214 222 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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; ERROR44000: CHECK OPTION failed `test`.`v1`
select c1,c2,c3 from t1;
c1 c2 c3 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
truncate table t1;
insert into t1 select * from tmp;
update v1 set c2=(select max(c3) from v1) where c1=1; ERROR44000: CHECK OPTION failed `test`.`v1`
select c1,c2,c3 from t1;
c1 c2 c3 111 122 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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 022 111 133 11111 11212 11313 12114 12215 12316 12417 12518 214 225 236 247 258 21221 21322 21423 22224 22325 22426 22527 22628 31231 31332 31433 32234 32335 32436 32537 32638
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;
Messung V0.5 in Prozent
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen2.22Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-10-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.