mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-29390: Improve coverage for UPDATE and DELETE statements in MTR test suites
Created tests for "delete" based on update_use_source.test For the update_use_source.test tests, data recovery in the table has been changed from a rollback transaction to a complete delete and re-insert of the data with optimize table. Cases are now being checked on three engines. Added tests for update/delete with LooseScan and DuplicateWeedout optimization strategies Added tests for engine MEMORY on delete and update Added tests for multi-update with JSON_TABLE Added tests for multi-update and multi-delete for engine Connect
This commit is contained in:
committed by
Igor Babaev
parent
9a3fd1df01
commit
1e0a72a18b
94
mysql-test/include/delete_use_source.inc
Normal file
94
mysql-test/include/delete_use_source.inc
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
create table t1 (c1 integer, c2 integer, c3 integer);
|
||||||
|
|
||||||
|
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 c1+10,c2,c3+10 from t1;
|
||||||
|
insert into t1 select c1+20,c2+1,c3+20 from t1;
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
|
||||||
|
create view v1 as select * from t1 where c2=2;
|
||||||
|
|
||||||
|
--echo #######################################
|
||||||
|
--echo # Test without any index #
|
||||||
|
--echo #######################################
|
||||||
|
--source include/delete_use_source_cases.inc
|
||||||
|
--source include/delete_use_source_cases_non_innodb.inc
|
||||||
|
|
||||||
|
--echo #######################################
|
||||||
|
--echo # Test with an index #
|
||||||
|
--echo #######################################
|
||||||
|
create index t1_c2 on t1 (c2,c1);
|
||||||
|
--source include/delete_use_source_cases.inc
|
||||||
|
--source include/delete_use_source_cases_non_innodb.inc
|
||||||
|
|
||||||
|
--echo #######################################
|
||||||
|
--echo # Test with a primary key #
|
||||||
|
--echo #######################################
|
||||||
|
drop index t1_c2 on t1;
|
||||||
|
alter table t1 add primary key (c3);
|
||||||
|
--source include/delete_use_source_cases.inc
|
||||||
|
--source include/delete_use_source_cases_non_innodb.inc
|
||||||
|
|
||||||
|
drop view v1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Test on dynamic columns (blob)
|
||||||
|
--echo #
|
||||||
|
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));
|
||||||
|
INSERT INTO assets
|
||||||
|
VALUES ('Fridge',
|
||||||
|
COLUMN_CREATE('color', 'white', 'warranty', '5 years'));
|
||||||
|
INSERT INTO assets
|
||||||
|
VALUES ('Microwave',
|
||||||
|
COLUMN_CREATE('warranty', '3 years'));
|
||||||
|
SELECT item_name, COLUMN_GET(dynamic_cols, 'color' as char) AS color
|
||||||
|
FROM assets ORDER BY item_name;
|
||||||
|
UPDATE assets SET dynamic_cols=COLUMN_DELETE(dynamic_cols, 'color')
|
||||||
|
WHERE item_name='Fridge';
|
||||||
|
SELECT item_name, COLUMN_GET(dynamic_cols, 'color' as char) AS color
|
||||||
|
FROM assets ORDER BY item_name;
|
||||||
|
DELETE FROM assets
|
||||||
|
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, 'color' as char) AS color
|
||||||
|
FROM assets ORDER BY item_name;
|
||||||
|
DELETE FROM assets WHERE item_name='Microwave';
|
||||||
|
SELECT item_name, COLUMN_GET(dynamic_cols, 'color' as char) AS color
|
||||||
|
FROM assets ORDER BY item_name;
|
||||||
|
drop table assets ;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Test on fulltext columns
|
||||||
|
--echo #
|
||||||
|
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');
|
||||||
|
DELETE FROM ft2 WHERE MATCH(copy) AGAINST('database');
|
||||||
|
SELECT * FROM ft2 WHERE MATCH(copy) AGAINST('database');
|
||||||
|
drop table ft2;
|
||||||
|
|
214
mysql-test/include/delete_use_source_cases.inc
Normal file
214
mysql-test/include/delete_use_source_cases.inc
Normal file
@ -0,0 +1,214 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Delete with value from subquery on the same table
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
|
||||||
|
let $c = c1=(select a.c3 from t1 a where a.c3 = t1.c3);
|
||||||
|
eval create table tmp as select * from t1 where $c;
|
||||||
|
let $q = delete from t1 where $c;
|
||||||
|
eval explain select * from t1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete with EXISTS subquery over the updated table
|
||||||
|
--echo # in WHERE + possibly sargable condition
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
|
||||||
|
let $c = c1 = 1 and exists (select 'X' from t1 a where a.c1 = t1.c2);
|
||||||
|
eval create table tmp as select * from t1 where $c;
|
||||||
|
let $q = delete from t1 where $c;
|
||||||
|
eval explain select * from t1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
eval analyze $q;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete with IN predicand over the updated table in WHERE
|
||||||
|
--echo #
|
||||||
|
let $c = c3 in (select distinct a.c1 from t1 a where t1.c2=a.c2);
|
||||||
|
eval create table tmp as select * from t1 where $c;
|
||||||
|
let $q = delete from t1 where $c;
|
||||||
|
eval explain select * from t1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete with a limit - can be deleted
|
||||||
|
--echo #
|
||||||
|
let $c = c1 in (select a.c2 from t1 a where a.c2 = t1.c3) limit 1;
|
||||||
|
eval create table tmp as select * from t1 where $c;
|
||||||
|
let $q = delete from t1 where $c;
|
||||||
|
eval explain select * from t1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
eval analyze $q;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete with a limit and an order by
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
let $c = c1 in (select a.c2 from t1 a where a.c3 = t1.c3)
|
||||||
|
order by c3 desc limit 1;
|
||||||
|
eval create table tmp as select * from t1 where $c;
|
||||||
|
let $q = delete from t1 where $c;
|
||||||
|
eval explain select * from t1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete: 2 execution of PS
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
prepare create_tmp_stmt from
|
||||||
|
"create table tmp as select * from t1
|
||||||
|
where c2=(select a.c3 from t1 a where a.c3 = ?)";
|
||||||
|
prepare delete_t1_stmt from
|
||||||
|
"delete from t1 where c2=(select a.c3 from t1 a where a.c3 = ?)";
|
||||||
|
set @a:=5;
|
||||||
|
execute create_tmp_stmt using @a;
|
||||||
|
execute delete_t1_stmt using @a;
|
||||||
|
execute delete_t1_stmt using @a;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
|
||||||
|
prepare insert_tmp_stmt from
|
||||||
|
"insert into tmp(c1,c2,c3) select * from t1
|
||||||
|
where c2=(select a.c3 from t1 a where a.c3 = ?)";
|
||||||
|
set @a:=2;
|
||||||
|
execute insert_tmp_stmt using @a;
|
||||||
|
execute delete_t1_stmt using @a;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete in stored procedure
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
delimiter //;
|
||||||
|
create procedure sp()
|
||||||
|
begin
|
||||||
|
delete from t1 where c1 in (select a.c2 from t1 a where a.c3 = t1.c3)
|
||||||
|
order by c3 desc limit 1;
|
||||||
|
end
|
||||||
|
//
|
||||||
|
delimiter ;//
|
||||||
|
|
||||||
|
create table tmp as select * from t1
|
||||||
|
where c1 in (select a.c2 from t1 a where a.c3 = t1.c3)
|
||||||
|
order by c3 desc limit 1;
|
||||||
|
CALL sp;
|
||||||
|
insert into tmp(c1,c2,c3) select * from t1
|
||||||
|
where c1 in (select a.c2 from t1 a where a.c3 = t1.c3)
|
||||||
|
order by c3 desc limit 1;
|
||||||
|
CALL sp;
|
||||||
|
insert into tmp(c1,c2,c3) select * from t1
|
||||||
|
where c1 in (select a.c2 from t1 a where a.c3 = t1.c3)
|
||||||
|
order by c3 desc limit 1;
|
||||||
|
CALL sp;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop procedure sp;
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete in stored function
|
||||||
|
--echo #
|
||||||
|
delimiter //;
|
||||||
|
create function f1(IN a INT) returns int
|
||||||
|
begin
|
||||||
|
delete from t1 where c3 < a order by c3 limit 1;
|
||||||
|
return 1;
|
||||||
|
end;//
|
||||||
|
delimiter ;//
|
||||||
|
|
||||||
|
set @a:=7;
|
||||||
|
create table tmp as select * from t1 where c3 < @a
|
||||||
|
order by c3 limit 1;
|
||||||
|
select f1(@a);
|
||||||
|
insert into tmp(c1,c2,c3) select * from t1 where c3 < @a
|
||||||
|
order by c3 limit 1;
|
||||||
|
select f1(@a);
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop function f1;
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete in trigger
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
create table t2 (c1 integer);
|
||||||
|
insert into t2(c1) values (1), (2), (3), (4), (5), (6), (7), (8);
|
||||||
|
|
||||||
|
CREATE TABLE cnt(del integer);
|
||||||
|
INSERT INTO cnt VALUES(0);
|
||||||
|
|
||||||
|
CREATE TRIGGER tr1 AFTER DELETE ON t1 FOR EACH ROW
|
||||||
|
UPDATE cnt SET del=del+1;
|
||||||
|
CREATE TRIGGER tr2 AFTER DELETE ON t1 FOR EACH ROW
|
||||||
|
DELETE FROM t2 WHERE c1> (SELECT count(*)-1 FROM t2);
|
||||||
|
|
||||||
|
CREATE TABLE tmp as SELECT * FROM t1 WHERE c2>=3;
|
||||||
|
--enable_info ONCE
|
||||||
|
DELETE FROM t1 WHERE c2>=3;
|
||||||
|
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
--sorted_result
|
||||||
|
SELECT * FROM t2;
|
||||||
|
SELECT * FROM cnt;
|
||||||
|
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
|
||||||
|
DROP TRIGGER tr1;
|
||||||
|
DROP TRIGGER tr2;
|
||||||
|
drop table t2, cnt, tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete with a reference to view in subquery
|
||||||
|
--echo #
|
||||||
|
let $c = t1.c2 in ( select max(a.c2) from v1 a
|
||||||
|
where a.c1 = t1.c1);
|
||||||
|
eval create table tmp as select * from t1 where $c;
|
||||||
|
let $q = delete from t1 where $c;
|
||||||
|
eval explain select * from t1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
eval analyze $q;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop table tmp;
|
||||||
|
|
294
mysql-test/include/delete_use_source_cases_memory.inc
Normal file
294
mysql-test/include/delete_use_source_cases_memory.inc
Normal file
@ -0,0 +1,294 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Delete with value from subquery on the same table
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
|
||||||
|
let $c = c1=(select a.c3 from t1 a where a.c3 = t1.c3);
|
||||||
|
eval create table tmp as select * from t1 where $c;
|
||||||
|
let $q = delete from t1 where $c;
|
||||||
|
eval explain select * from t1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete with EXISTS subquery over the updated table
|
||||||
|
--echo # in WHERE + possibly sargable condition
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
|
||||||
|
let $c = c1 = 1 and exists (select 'X' from t1 a where a.c1 = t1.c2);
|
||||||
|
eval create table tmp as select * from t1 where $c;
|
||||||
|
let $q = delete from t1 where $c;
|
||||||
|
eval explain select * from t1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete with EXISTS subquery over the updated table
|
||||||
|
--echo # in WHERE + non-sargable condition
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
|
||||||
|
let $c = exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 = 3;
|
||||||
|
eval create table tmp as select * from t1 where $c;
|
||||||
|
let $q = delete from t1 where $c;
|
||||||
|
eval explain select * from t1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete with order by
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
|
||||||
|
let $c = exists (select 'X' from t1 a where a.c2 = t1.c2)
|
||||||
|
and c2 >= 3 order by c2;
|
||||||
|
eval create table tmp as select * from t1 where $c;
|
||||||
|
let $q = delete from t1 where $c;
|
||||||
|
eval explain select * from t1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete with IN predicand over the updated table in WHERE
|
||||||
|
--echo #
|
||||||
|
let $c = c3 in (select distinct a.c1 from t1 a where t1.c2=a.c2);
|
||||||
|
eval create table tmp as select * from t1 where $c;
|
||||||
|
let $q = delete from t1 where $c;
|
||||||
|
eval explain select * from t1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete with a limit - can be deleted
|
||||||
|
--echo #
|
||||||
|
let $c = c1 in (select a.c2 from t1 a where a.c2 = t1.c3) limit 1;
|
||||||
|
eval create table tmp as select * from t1 where $c;
|
||||||
|
let $q = delete from t1 where $c;
|
||||||
|
eval explain select * from t1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete with a limit and an order by
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
let $c = c1 in (select a.c2 from t1 a where a.c3 = t1.c3)
|
||||||
|
order by c3 desc limit 1;
|
||||||
|
eval create table tmp as select * from t1 where $c;
|
||||||
|
let $q = delete from t1 where $c;
|
||||||
|
eval explain select * from t1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete: 2 execution of PS
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
prepare create_tmp_stmt from
|
||||||
|
"create table tmp as select * from t1
|
||||||
|
where c2=(select a.c3 from t1 a where a.c3 = ?)";
|
||||||
|
prepare delete_t1_stmt from
|
||||||
|
"delete from t1 where c2=(select a.c3 from t1 a where a.c3 = ?)";
|
||||||
|
set @a:=5;
|
||||||
|
execute create_tmp_stmt using @a;
|
||||||
|
execute delete_t1_stmt using @a;
|
||||||
|
execute delete_t1_stmt using @a;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
|
||||||
|
prepare insert_tmp_stmt from
|
||||||
|
"insert into tmp(c1,c2,c3) select * from t1
|
||||||
|
where c2=(select a.c3 from t1 a where a.c3 = ?)";
|
||||||
|
set @a:=2;
|
||||||
|
execute insert_tmp_stmt using @a;
|
||||||
|
execute delete_t1_stmt using @a;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete in stored procedure
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
delimiter //;
|
||||||
|
create procedure sp()
|
||||||
|
begin
|
||||||
|
delete from t1 where c1 in (select a.c2 from t1 a where a.c3 = t1.c3)
|
||||||
|
order by c3 desc limit 1;
|
||||||
|
end
|
||||||
|
//
|
||||||
|
delimiter ;//
|
||||||
|
|
||||||
|
create table tmp as select * from t1
|
||||||
|
where c1 in (select a.c2 from t1 a where a.c3 = t1.c3)
|
||||||
|
order by c3 desc limit 1;
|
||||||
|
CALL sp;
|
||||||
|
insert into tmp(c1,c2,c3) select * from t1
|
||||||
|
where c1 in (select a.c2 from t1 a where a.c3 = t1.c3)
|
||||||
|
order by c3 desc limit 1;
|
||||||
|
CALL sp;
|
||||||
|
insert into tmp(c1,c2,c3) select * from t1
|
||||||
|
where c1 in (select a.c2 from t1 a where a.c3 = t1.c3)
|
||||||
|
order by c3 desc limit 1;
|
||||||
|
CALL sp;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop procedure sp;
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete in stored function
|
||||||
|
--echo #
|
||||||
|
delimiter //;
|
||||||
|
create function f1(IN a INT) returns int
|
||||||
|
begin
|
||||||
|
delete from t1 where c3 < a order by c3 limit 1;
|
||||||
|
return 1;
|
||||||
|
end;//
|
||||||
|
delimiter ;//
|
||||||
|
|
||||||
|
set @a:=7;
|
||||||
|
create table tmp as select * from t1 where c3 < @a
|
||||||
|
order by c3 limit 1;
|
||||||
|
select f1(@a);
|
||||||
|
insert into tmp(c1,c2,c3) select * from t1 where c3 < @a
|
||||||
|
order by c3 limit 1;
|
||||||
|
select f1(@a);
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop function f1;
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete in trigger
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
create table t2 (c1 integer);
|
||||||
|
insert into t2(c1) values (1), (2), (3), (4), (5), (6), (7), (8);
|
||||||
|
|
||||||
|
CREATE TABLE cnt(del integer);
|
||||||
|
INSERT INTO cnt VALUES(0);
|
||||||
|
|
||||||
|
CREATE TRIGGER tr1 AFTER DELETE ON t1 FOR EACH ROW
|
||||||
|
UPDATE cnt SET del=del+1;
|
||||||
|
CREATE TRIGGER tr2 AFTER DELETE ON t1 FOR EACH ROW
|
||||||
|
DELETE FROM t2 WHERE c1> (SELECT count(*)-1 FROM t2);
|
||||||
|
|
||||||
|
CREATE TABLE tmp as SELECT * FROM t1 WHERE c2>=3;
|
||||||
|
--enable_info ONCE
|
||||||
|
DELETE FROM t1 WHERE c2>=3;
|
||||||
|
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
--sorted_result
|
||||||
|
SELECT * FROM t2;
|
||||||
|
SELECT * FROM cnt;
|
||||||
|
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
|
||||||
|
DROP TRIGGER tr1;
|
||||||
|
DROP TRIGGER tr2;
|
||||||
|
drop table t2, cnt, tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo Delete with a reference to view in subquery
|
||||||
|
--echo #
|
||||||
|
let $c = t1.c2 in ( select max(a.c2) from v1 a
|
||||||
|
where a.c1 = t1.c1);
|
||||||
|
eval create table tmp as select * from t1 where $c;
|
||||||
|
let $q = delete from t1 where $c;
|
||||||
|
eval explain select * from t1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete from view
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
|
||||||
|
let $c = v1.c1 in
|
||||||
|
(select max(a.c1) from t1 a where a.c2 = v1.c2) and c3 = 5;
|
||||||
|
eval create table tmp as select * from v1 where $c;
|
||||||
|
let $q = delete from v1 where $c;
|
||||||
|
eval explain select * from v1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete from view using reference
|
||||||
|
--echo # to the same view in subquery
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
|
||||||
|
let $c = v1.c2 in (select max(a.c2) from t1 a where a.c3 = v1.c3)
|
||||||
|
and c1 = 2
|
||||||
|
and exists (select 'X' from v1 a where a.c1 = v1.c1);
|
||||||
|
eval create table tmp as select * from v1 where $c;
|
||||||
|
let $q = delete from v1 where $c;
|
||||||
|
eval explain select * from v1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop table tmp;
|
||||||
|
|
81
mysql-test/include/delete_use_source_cases_non_innodb.inc
Normal file
81
mysql-test/include/delete_use_source_cases_non_innodb.inc
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Delete with EXISTS subquery over the updated table
|
||||||
|
--echo # in WHERE + non-sargable condition
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
|
||||||
|
let $c = exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 = 3;
|
||||||
|
eval create table tmp as select * from t1 where $c;
|
||||||
|
let $q = delete from t1 where $c;
|
||||||
|
eval explain select * from t1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete with order by
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
|
||||||
|
let $c = exists (select 'X' from t1 a where a.c2 = t1.c2)
|
||||||
|
and c2 >= 3 order by c2;
|
||||||
|
eval create table tmp as select * from t1 where $c;
|
||||||
|
let $q = delete from t1 where $c;
|
||||||
|
--replace_column 9 #
|
||||||
|
eval explain select * from t1 where $c;
|
||||||
|
--replace_column 9 #
|
||||||
|
eval explain $q;
|
||||||
|
--replace_column 9 #
|
||||||
|
eval analyze $q;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete from view
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
|
||||||
|
let $c = v1.c1 in
|
||||||
|
(select max(a.c1) from t1 a where a.c2 = v1.c2) and c3 = 5;
|
||||||
|
eval create table tmp as select * from v1 where $c;
|
||||||
|
let $q = delete from v1 where $c;
|
||||||
|
eval explain select * from v1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop table tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete from view using reference
|
||||||
|
--echo # to the same view in subquery
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
|
||||||
|
let $c = v1.c2 in (select max(a.c2) from t1 a where a.c3 = v1.c3)
|
||||||
|
and c1 = 2
|
||||||
|
and exists (select 'X' from v1 a where a.c1 = v1.c1);
|
||||||
|
eval create table tmp as select * from v1 where $c;
|
||||||
|
let $q = delete from v1 where $c;
|
||||||
|
--replace_column 9 #
|
||||||
|
eval explain select * from v1 where $c;
|
||||||
|
--replace_column 9 #
|
||||||
|
eval explain $q;
|
||||||
|
--replace_column 9 #
|
||||||
|
eval analyze $q;
|
||||||
|
--sorted_result
|
||||||
|
select * from t1;
|
||||||
|
insert into t1(c1,c2,c3) select c1,c2,c3 from tmp;
|
||||||
|
drop table tmp;
|
91
mysql-test/include/delete_use_source_innodb.inc
Normal file
91
mysql-test/include/delete_use_source_innodb.inc
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
create table t1 (c1 integer, c2 integer, c3 integer);
|
||||||
|
|
||||||
|
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 c1+10,c2,c3+10 from t1;
|
||||||
|
insert into t1 select c1+20,c2+1,c3+20 from t1;
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
|
||||||
|
create view v1 as select * from t1 where c2=2;
|
||||||
|
|
||||||
|
--echo #######################################
|
||||||
|
--echo # Test without any index #
|
||||||
|
--echo #######################################
|
||||||
|
--source include/delete_use_source_cases.inc
|
||||||
|
|
||||||
|
--echo #######################################
|
||||||
|
--echo # Test with an index #
|
||||||
|
--echo #######################################
|
||||||
|
create index t1_c2 on t1 (c2,c1);
|
||||||
|
--source include/delete_use_source_cases.inc
|
||||||
|
|
||||||
|
--echo #######################################
|
||||||
|
--echo # Test with a primary key #
|
||||||
|
--echo #######################################
|
||||||
|
drop index t1_c2 on t1;
|
||||||
|
alter table t1 add primary key (c3);
|
||||||
|
--source include/delete_use_source_cases.inc
|
||||||
|
|
||||||
|
drop view v1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Test on dynamic columns (blob)
|
||||||
|
--echo #
|
||||||
|
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));
|
||||||
|
INSERT INTO assets
|
||||||
|
VALUES ('Fridge',
|
||||||
|
COLUMN_CREATE('color', 'white', 'warranty', '5 years'));
|
||||||
|
INSERT INTO assets
|
||||||
|
VALUES ('Microwave',
|
||||||
|
COLUMN_CREATE('warranty', '3 years'));
|
||||||
|
SELECT item_name, COLUMN_GET(dynamic_cols, 'color' as char) AS color
|
||||||
|
FROM assets ORDER BY item_name;
|
||||||
|
UPDATE assets SET dynamic_cols=COLUMN_DELETE(dynamic_cols, 'color')
|
||||||
|
WHERE item_name='Fridge';
|
||||||
|
SELECT item_name, COLUMN_GET(dynamic_cols, 'color' as char) AS color
|
||||||
|
FROM assets ORDER BY item_name;
|
||||||
|
DELETE FROM assets
|
||||||
|
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, 'color' as char) AS color
|
||||||
|
FROM assets ORDER BY item_name;
|
||||||
|
DELETE FROM assets WHERE item_name='Microwave';
|
||||||
|
SELECT item_name, COLUMN_GET(dynamic_cols, 'color' as char) AS color
|
||||||
|
FROM assets ORDER BY item_name;
|
||||||
|
drop table assets ;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Test on fulltext columns
|
||||||
|
--echo #
|
||||||
|
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');
|
||||||
|
DELETE FROM ft2 WHERE MATCH(copy) AGAINST('database');
|
||||||
|
SELECT * FROM ft2 WHERE MATCH(copy) AGAINST('database');
|
||||||
|
drop table ft2;
|
||||||
|
|
33
mysql-test/include/delete_use_source_memory.inc
Normal file
33
mysql-test/include/delete_use_source_memory.inc
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
create table t1 (c1 integer, c2 integer, c3 integer);
|
||||||
|
|
||||||
|
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 c1+10,c2,c3+10 from t1;
|
||||||
|
insert into t1 select c1+20,c2+1,c3+20 from t1;
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
|
||||||
|
create view v1 as select * from t1 where c2=2;
|
||||||
|
|
||||||
|
--echo #######################################
|
||||||
|
--echo # Test without any index #
|
||||||
|
--echo #######################################
|
||||||
|
--source include/delete_use_source_cases_memory.inc
|
||||||
|
|
||||||
|
--echo #######################################
|
||||||
|
--echo # Test with an index #
|
||||||
|
--echo #######################################
|
||||||
|
create index t1_c2 on t1 (c2,c1);
|
||||||
|
--source include/delete_use_source_cases_memory.inc
|
||||||
|
|
||||||
|
--echo #######################################
|
||||||
|
--echo # Test with a primary key #
|
||||||
|
--echo #######################################
|
||||||
|
drop index t1_c2 on t1;
|
||||||
|
alter table t1 add primary key (c3);
|
||||||
|
--source include/delete_use_source_cases_memory.inc
|
||||||
|
|
||||||
|
drop view v1;
|
||||||
|
drop table t1;
|
||||||
|
|
@ -1,150 +1,188 @@
|
|||||||
# Include to test update with same table as source and target
|
# Include to test update with same table as source and target
|
||||||
|
|
||||||
--echo #
|
create table t1 (old_c1 integer,
|
||||||
--echo # Update a with value from subquery on the same table, no search clause. ALL access
|
old_c2 integer,
|
||||||
--echo #
|
c1 integer,
|
||||||
|
c2 integer,
|
||||||
|
c3 integer);
|
||||||
|
|
||||||
#Enable view protocol after fix MDEV-29207
|
create view v1 as select * from t1 where c2=2;
|
||||||
--disable_view_protocol
|
delimiter /;
|
||||||
start transaction;
|
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;
|
||||||
|
/
|
||||||
|
delimiter ;/
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
create table tmp as select * from t1;
|
||||||
|
|
||||||
|
--echo #######################################
|
||||||
|
--echo # Test without any index #
|
||||||
|
--echo #######################################
|
||||||
|
--source include/update_use_source_cases.inc
|
||||||
|
|
||||||
|
--echo #######################################
|
||||||
|
--echo # Test with an index #
|
||||||
|
--echo #######################################
|
||||||
|
create index t1_c2 on t1 (c2,c1);
|
||||||
|
analyze table t1;
|
||||||
|
--source include/update_use_source_cases.inc
|
||||||
|
|
||||||
|
--echo #######################################
|
||||||
|
--echo # Test with a primary key #
|
||||||
|
--echo #######################################
|
||||||
|
drop index t1_c2 on t1;
|
||||||
|
alter table t1 add primary key (c3);
|
||||||
|
analyze table t1;
|
||||||
|
--source include/update_use_source_cases.inc
|
||||||
|
|
||||||
|
--echo # Update with error "Subquery returns more than 1 row"
|
||||||
|
--error ER_SUBQUERY_NO_1_ROW
|
||||||
|
update t1 set c2=(select c2 from t1);
|
||||||
|
--sorted_result
|
||||||
|
select c1,c2,c3 from t1;
|
||||||
|
|
||||||
|
--echo # Update with error "Subquery returns more than 1 row"
|
||||||
|
--echo # and order by
|
||||||
|
--error ER_SUBQUERY_NO_1_ROW
|
||||||
|
update t1 set c2=(select c2 from t1) order by c3;
|
||||||
|
--sorted_result
|
||||||
|
select c1,c2,c3 from t1;
|
||||||
|
|
||||||
|
-- echo # Duplicate value on update a primary key
|
||||||
|
--error ER_DUP_ENTRY
|
||||||
|
|
||||||
|
update t1 set c3=0
|
||||||
|
where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
|
||||||
|
--sorted_result
|
||||||
|
select c1,c2,c3 from t1;
|
||||||
|
truncate table t1;
|
||||||
|
insert into t1 select * from tmp;
|
||||||
|
|
||||||
|
-- echo # Duplicate value on update a primary key with ignore
|
||||||
--enable_info ONCE
|
--enable_info ONCE
|
||||||
update t1
|
update ignore t1 set c3=0
|
||||||
set c1=(select a.c3
|
where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
|
||||||
from t1 a
|
--sorted_result
|
||||||
where a.c3 = t1.c3);
|
select c1,c2,c3 from t1;
|
||||||
select concat(old_c1,'->',c1),c3, case when c1 != old_c1 then '*' else ' ' end "Changed" from t1 ;
|
truncate table t1;
|
||||||
rollback;
|
insert into t1 select * from tmp;
|
||||||
|
|
||||||
--echo #
|
-- echo # Duplicate value on update a primary key and limit
|
||||||
--echo # Update with search clause on the same table
|
--error ER_DUP_ENTRY
|
||||||
--echo #
|
update t1 set c3=0
|
||||||
|
where exists (select 'X' from t1 a where a.c2 = t1.c2)
|
||||||
|
and c2 >= 3 limit 2;
|
||||||
|
--sorted_result
|
||||||
|
select c1,c2,c3 from t1;
|
||||||
|
truncate table t1;
|
||||||
|
insert into t1 select * from tmp;
|
||||||
|
|
||||||
start transaction;
|
-- echo # Duplicate value on update a primary key with ignore
|
||||||
|
-- echo # and limit
|
||||||
--enable_info ONCE
|
--enable_info ONCE
|
||||||
update t1
|
update ignore t1 set c3=0
|
||||||
set c1=10
|
where exists (select 'X' from t1 a where a.c2 = t1.c2)
|
||||||
where c1 <2
|
and c2 >= 3 limit 2;
|
||||||
and exists (select 'X'
|
--sorted_result
|
||||||
from t1 a
|
select c1,c2,c3 from t1;
|
||||||
where a.c1 = t1.c1);
|
truncate table t1;
|
||||||
select concat(old_c1,'->',c1),c3, case when c1 != old_c1 then '*' else ' ' end "Changed" from t1 ;
|
insert into t1 select * from tmp;
|
||||||
rollback;
|
|
||||||
|
|
||||||
--echo #
|
--echo # Update no rows found
|
||||||
--echo # Update via RANGE or INDEX access if an index or a primary key exists
|
|
||||||
--echo #
|
|
||||||
|
|
||||||
explain update t1 set c1=0 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 > 3;
|
|
||||||
start transaction;
|
|
||||||
--enable_info ONCE
|
--enable_info ONCE
|
||||||
update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
|
update t1 set c1=10
|
||||||
select concat(old_c1,'->',c1),c3, case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
|
where c1 <2 and exists (select 'X' from t1 a where a.c1 = t1.c1 + 10);
|
||||||
rollback;
|
--sorted_result
|
||||||
|
select c1,c2,c3 from t1;
|
||||||
|
truncate table t1;
|
||||||
|
insert into t1 select * from tmp;
|
||||||
|
|
||||||
--echo #
|
--echo # Update no rows changed
|
||||||
--echo # Update with order by
|
drop trigger trg_t1;
|
||||||
--echo #
|
|
||||||
|
|
||||||
start transaction;
|
|
||||||
update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3 order by c2;
|
|
||||||
select concat(old_c1,'->',c1),c3, case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
|
|
||||||
rollback;
|
|
||||||
|
|
||||||
--echo #
|
|
||||||
--echo Update using a view in subquery
|
|
||||||
--echo #
|
|
||||||
|
|
||||||
start transaction;
|
|
||||||
--enable_info ONCE
|
--enable_info ONCE
|
||||||
update t1
|
update t1 set c1=c1
|
||||||
set c1=c1 +(select max(a.c2)
|
where c1 <2 and exists (select 'X' from t1 a where a.c1 = t1.c1);
|
||||||
from v1 a
|
--sorted_result
|
||||||
where a.c1 = t1.c1) ;
|
select c1,c2,c3 from t1;
|
||||||
select concat(old_c1,'->',c1),c3, case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
|
truncate table t1;
|
||||||
rollback;
|
insert into t1 select * from tmp;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # Update throw a view
|
--echo # Check call of after trigger
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
start transaction;
|
delimiter /;
|
||||||
--enable_info ONCE
|
create or replace trigger trg_t2 after update on t1 for each row
|
||||||
update v1
|
begin
|
||||||
set c1=c1 + (select max(a.c2)
|
declare msg varchar(100);
|
||||||
from t1 a
|
if (new.c3 = 5) then
|
||||||
where a.c1 = v1.c1) +10
|
set msg=concat('in after update trigger on ',new.c3);
|
||||||
where c3 > 3;
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
|
||||||
select concat(old_c1,'->',c1),c3, case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
|
end if;
|
||||||
rollback;
|
end;
|
||||||
|
/
|
||||||
|
delimiter ;/
|
||||||
|
--error 1644
|
||||||
|
|
||||||
|
update t1 set c1=2
|
||||||
|
where c3 in (select distinct a.c3 from t1 a where a.c1=t1.c1);
|
||||||
|
--sorted_result
|
||||||
|
select c1,c2,c3 from t1;
|
||||||
|
truncate table t1;
|
||||||
|
insert into t1 select * from tmp;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # Update through a view and using the view in subquery
|
--echo # Check update with order by and after trigger
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
start transaction;
|
--error 1644
|
||||||
--enable_info ONCE
|
update t1 set c1=2
|
||||||
update v1
|
where c3 in (select distinct a.c3 from t1 a where a.c1=t1.c1)
|
||||||
set c1=c1 + 1
|
order by t1.c2, t1.c1;
|
||||||
where c1 <2
|
--sorted_result
|
||||||
and exists (select 'X'
|
select c1,c2,c3 from t1;
|
||||||
from v1 a
|
truncate table t1;
|
||||||
where a.c1 = v1.c1);
|
insert into t1 select * from tmp;
|
||||||
select concat(old_c1,'->',c1),c3, case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
|
|
||||||
rollback;
|
drop view v1;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # Update through a view and using the view in subquery
|
--echo # Check update on view with check option
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
start transaction;
|
create view v1 as select * from t1 where c2=2 with check option;
|
||||||
--enable_info ONCE
|
|
||||||
update v1
|
|
||||||
set c1=(select max(a.c1)+10
|
|
||||||
from v1 a
|
|
||||||
where a.c1 = v1.c1)
|
|
||||||
where c1 <10
|
|
||||||
and exists (select 'X'
|
|
||||||
from v1 a
|
|
||||||
where a.c2 = v1.c2);
|
|
||||||
select concat(old_c1,'->',c1),c3, case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
|
|
||||||
rollback;
|
|
||||||
|
|
||||||
--echo #
|
-- error 1369
|
||||||
--echo # Update of the index or primary key (c3)
|
update v1 set c2=3 where c1=1;
|
||||||
--echo #
|
--sorted_result
|
||||||
|
select c1,c2,c3 from t1;
|
||||||
|
truncate table t1;
|
||||||
|
insert into t1 select * from tmp;
|
||||||
|
|
||||||
start transaction;
|
-- error 1369
|
||||||
explain update t1 set c3=c3+10 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
|
update v1 set c2=(select max(c3) from v1) where c1=1;
|
||||||
--enable_info ONCE
|
--sorted_result
|
||||||
update t1 set c3=c3+10 where c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
|
select c1,c2,c3 from t1;
|
||||||
select c3 from t1;
|
truncate table t1;
|
||||||
rollback;
|
insert into t1 select * from tmp;
|
||||||
|
|
||||||
--echo #
|
update v1 set c2=(select min(va.c3) from v1 va), c1=0 where c1=1;
|
||||||
--echo # update with a limit
|
--sorted_result
|
||||||
--echo #
|
select c1,c2,c3 from t1;
|
||||||
|
truncate table t1;
|
||||||
|
insert into t1 select * from tmp;
|
||||||
|
|
||||||
start transaction;
|
drop table tmp;
|
||||||
--enable_info ONCE
|
drop view v1;
|
||||||
update t1
|
drop table t1;
|
||||||
set c1=(select a.c3
|
|
||||||
from t1 a
|
|
||||||
where a.c3 = t1.c3)
|
|
||||||
limit 2;
|
|
||||||
select concat(old_c1,'->',c1),c3, case when c1 != old_c1 then '*' else ' ' end "Changed" from t1 ;
|
|
||||||
rollback;
|
|
||||||
|
|
||||||
--echo #
|
|
||||||
--echo # update with a limit and an order by
|
|
||||||
--echo #
|
|
||||||
|
|
||||||
start transaction;
|
|
||||||
--enable_info ONCE
|
|
||||||
update t1
|
|
||||||
set c1=(select a.c3
|
|
||||||
from t1 a
|
|
||||||
where a.c3 = t1.c3)
|
|
||||||
order by c3 desc limit 2;
|
|
||||||
select concat(old_c1,'->',c1),c3, case when c1 != old_c1 then '*' else ' ' end "Changed" from t1 ;
|
|
||||||
rollback;
|
|
||||||
--enable_view_protocol
|
|
||||||
|
183
mysql-test/include/update_use_source_cases.inc
Normal file
183
mysql-test/include/update_use_source_cases.inc
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Update with value from subquery on the same table
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
let $q = update t1 set c1=(select a.c3 from t1 a where a.c3 = t1.c3);
|
||||||
|
eval explain select * from t1;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
select concat(old_c1,'->',c1),c3,
|
||||||
|
case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
|
||||||
|
truncate table t1;
|
||||||
|
insert into t1 select * from tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Update with EXISTS subquery over the updated table
|
||||||
|
--echo # in WHERE + possibly sargable condition
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
let $c = c1 <2
|
||||||
|
and exists (select 'X' from t1 a where a.c1 = t1.c1);
|
||||||
|
let $q = update t1 set c1=10 where $c;
|
||||||
|
eval explain select * from t1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
select concat(old_c1,'->',c1),c3,
|
||||||
|
case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
|
||||||
|
truncate table t1;
|
||||||
|
insert into t1 select * from tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Update with EXISTS subquery over the updated table
|
||||||
|
--echo # in WHERE + non-sargable condition
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
let $c = exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
|
||||||
|
let $q = update t1 set c1=c1+10 where $c;
|
||||||
|
eval explain select * from t1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
select concat(old_c1,'->',c1),c3,
|
||||||
|
case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
|
||||||
|
truncate table t1;
|
||||||
|
insert into t1 select * from tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Update with order by
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
let $c = exists (select 'X' from t1 a where a.c2 = t1.c2)
|
||||||
|
and c2 >= 3 order by c2;
|
||||||
|
let $q = update t1 set c1=c1+10 where $c;
|
||||||
|
eval explain select * from t1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
select concat(old_c1,'->',c1),c3,
|
||||||
|
case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
|
||||||
|
truncate table t1;
|
||||||
|
insert into t1 select * from tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Update with a reference to view in subquery
|
||||||
|
--echo # in settable value
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
let $q = update t1 set c1=c1 +(select max(a.c2) from v1 a
|
||||||
|
where a.c1 = t1.c1);
|
||||||
|
eval explain select * from t1;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
select concat(old_c1,'->',c1),c3,
|
||||||
|
case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
|
||||||
|
truncate table t1;
|
||||||
|
insert into t1 select * from tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Update view
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
let $q = update v1 set c1=c1 + (select max(a.c2) from t1 a
|
||||||
|
where a.c1 = v1.c1) +10 where c3 > 3;
|
||||||
|
eval explain select * from v1;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
select concat(old_c1,'->',c1),c3,
|
||||||
|
case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
|
||||||
|
truncate table t1;
|
||||||
|
insert into t1 select * from tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Update view with reference to the same view in subquery
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
let $c = c1 <2
|
||||||
|
and exists (select 'X' from v1 a where a.c1 = v1.c1);
|
||||||
|
let $q = update v1 set c1=c1 + 1 where $c;
|
||||||
|
eval explain select * from v1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
select concat(old_c1,'->',c1),c3,
|
||||||
|
case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
|
||||||
|
truncate table t1;
|
||||||
|
insert into t1 select * from tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Update view with EXISTS and reference to the same view in subquery
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
let $c = c1 <10 and exists (select 'X' from v1 a where a.c2 = v1.c2);
|
||||||
|
let $q = update v1
|
||||||
|
set c1=(select max(a.c1)+10 from v1 a where a.c1 = v1.c1)
|
||||||
|
where $c;
|
||||||
|
eval explain select * from v1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
select concat(old_c1,'->',c1),c3,
|
||||||
|
case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
|
||||||
|
truncate table t1;
|
||||||
|
insert into t1 select * from tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Update with IN predicand over the updated table in WHERE
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
let $c = c2 in (select distinct a.c2 from t1 a where t1.c1=a.c1);
|
||||||
|
let $q = update t1 set c3=c3+110 where $c;
|
||||||
|
eval explain select * from t1 where $c;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
--sorted_result
|
||||||
|
select c3 from t1;
|
||||||
|
truncate table t1;
|
||||||
|
insert into t1 select * from tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Update with a limit
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
let $q = update t1
|
||||||
|
set c1=(select a.c3 from t1 a where a.c3 = t1.c3) limit 2;
|
||||||
|
eval explain select * from t1 limit 2;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
select concat(old_c1,'->',c1),c3,
|
||||||
|
case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
|
||||||
|
truncate table t1;
|
||||||
|
insert into t1 select * from tmp;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Update with a limit and an order by
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
analyze table t1 persistent for all;
|
||||||
|
let $q=update t1
|
||||||
|
set c1=(select a.c3 from t1 a where a.c3 = t1.c3)
|
||||||
|
order by c3 desc limit 2;
|
||||||
|
eval explain select * from t1 order by c3 desc limit 2;
|
||||||
|
eval explain $q;
|
||||||
|
--enable_info ONCE
|
||||||
|
eval $q;
|
||||||
|
select concat(old_c1,'->',c1),c3,
|
||||||
|
case when c1 != old_c1 then '*' else ' ' end "Changed" from t1;
|
||||||
|
truncate table t1;
|
||||||
|
insert into t1 select * from tmp;
|
59
mysql-test/include/update_use_source_ext.inc
Normal file
59
mysql-test/include/update_use_source_ext.inc
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Test on dynamic columns (blob)
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
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;
|
||||||
|
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;
|
||||||
|
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;
|
||||||
|
|
||||||
|
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;
|
||||||
|
drop table assets;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Test on fulltext columns
|
||||||
|
--echo #
|
||||||
|
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');
|
||||||
|
|
||||||
|
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');
|
||||||
|
drop table ft2;
|
@ -3419,4 +3419,834 @@ o_orderkey o_totalprice
|
|||||||
4903 34363.63
|
4903 34363.63
|
||||||
5607 24660.06
|
5607 24660.06
|
||||||
drop table t;
|
drop table t;
|
||||||
|
CREATE TABLE partsupp_small (
|
||||||
|
ps_partkey int(11) NOT NULL DEFAULT '0',
|
||||||
|
ps_suppkey int(11) NOT NULL DEFAULT '0',
|
||||||
|
ps_availqty int(11) DEFAULT NULL,
|
||||||
|
ps_supplycost double DEFAULT NULL,
|
||||||
|
ps_comment varchar(199) DEFAULT NULL,
|
||||||
|
PRIMARY KEY (ps_partkey,ps_suppkey),
|
||||||
|
KEY i_ps_partkey (ps_partkey),
|
||||||
|
KEY i_ps_suppkey (ps_suppkey)
|
||||||
|
);
|
||||||
|
create index i_ps_sup_part on partsupp_small(ps_suppkey, ps_partkey);
|
||||||
|
insert into partsupp_small select * from partsupp where ps_partkey <50;
|
||||||
|
analyze table partsupp_small persistent for all;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
dbt3_s001.partsupp_small analyze status Engine-independent statistics collected
|
||||||
|
dbt3_s001.partsupp_small analyze status OK
|
||||||
|
# LooseScan
|
||||||
|
# =========
|
||||||
|
explain
|
||||||
|
select count(*) from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY partsupp_small index PRIMARY,i_ps_partkey,i_ps_suppkey,i_ps_sup_part PRIMARY 8 NULL 176 Using where; Using index; LooseScan
|
||||||
|
1 PRIMARY lineitem ref i_l_suppkey_partkey,i_l_partkey i_l_partkey 5 dbt3_s001.partsupp_small.ps_partkey 30 Using index
|
||||||
|
explain format=json
|
||||||
|
select count(*) from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
EXPLAIN
|
||||||
|
{
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 1,
|
||||||
|
"cost": 0.222764041,
|
||||||
|
"nested_loop": [
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "partsupp_small",
|
||||||
|
"access_type": "index",
|
||||||
|
"possible_keys": [
|
||||||
|
"PRIMARY",
|
||||||
|
"i_ps_partkey",
|
||||||
|
"i_ps_suppkey",
|
||||||
|
"i_ps_sup_part"
|
||||||
|
],
|
||||||
|
"key": "PRIMARY",
|
||||||
|
"key_length": "8",
|
||||||
|
"used_key_parts": ["ps_partkey", "ps_suppkey"],
|
||||||
|
"loops": 1,
|
||||||
|
"rows": 176,
|
||||||
|
"cost": 0.019403477,
|
||||||
|
"filtered": 23.86363602,
|
||||||
|
"attached_condition": "partsupp_small.ps_suppkey in (1,2,3)",
|
||||||
|
"using_index": true,
|
||||||
|
"loose_scan": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "lineitem",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": ["i_l_suppkey_partkey", "i_l_partkey"],
|
||||||
|
"key": "i_l_partkey",
|
||||||
|
"key_length": "5",
|
||||||
|
"used_key_parts": ["l_partkey"],
|
||||||
|
"ref": ["dbt3_s001.partsupp_small.ps_partkey"],
|
||||||
|
"loops": 42,
|
||||||
|
"rows": 30,
|
||||||
|
"cost": 0.203360564,
|
||||||
|
"filtered": 2.380952358,
|
||||||
|
"using_index": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
explain
|
||||||
|
select l_partkey from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY partsupp_small index PRIMARY,i_ps_partkey,i_ps_suppkey,i_ps_sup_part PRIMARY 8 NULL 176 Using where; Using index; LooseScan
|
||||||
|
1 PRIMARY lineitem ref i_l_suppkey_partkey,i_l_partkey i_l_partkey 5 dbt3_s001.partsupp_small.ps_partkey 30 Using index
|
||||||
|
explain format=json
|
||||||
|
select l_partkey from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
EXPLAIN
|
||||||
|
{
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 1,
|
||||||
|
"cost": 0.222764041,
|
||||||
|
"nested_loop": [
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "partsupp_small",
|
||||||
|
"access_type": "index",
|
||||||
|
"possible_keys": [
|
||||||
|
"PRIMARY",
|
||||||
|
"i_ps_partkey",
|
||||||
|
"i_ps_suppkey",
|
||||||
|
"i_ps_sup_part"
|
||||||
|
],
|
||||||
|
"key": "PRIMARY",
|
||||||
|
"key_length": "8",
|
||||||
|
"used_key_parts": ["ps_partkey", "ps_suppkey"],
|
||||||
|
"loops": 1,
|
||||||
|
"rows": 176,
|
||||||
|
"cost": 0.019403477,
|
||||||
|
"filtered": 23.86363602,
|
||||||
|
"attached_condition": "partsupp_small.ps_suppkey in (1,2,3)",
|
||||||
|
"using_index": true,
|
||||||
|
"loose_scan": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "lineitem",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": ["i_l_suppkey_partkey", "i_l_partkey"],
|
||||||
|
"key": "i_l_partkey",
|
||||||
|
"key_length": "5",
|
||||||
|
"used_key_parts": ["l_partkey"],
|
||||||
|
"ref": ["dbt3_s001.partsupp_small.ps_partkey"],
|
||||||
|
"loops": 42,
|
||||||
|
"rows": 30,
|
||||||
|
"cost": 0.203360564,
|
||||||
|
"filtered": 2.380952358,
|
||||||
|
"using_index": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
select count(*) from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
count(*)
|
||||||
|
1175
|
||||||
|
create table t as
|
||||||
|
select * from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
explain
|
||||||
|
delete from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY partsupp_small index PRIMARY,i_ps_partkey,i_ps_suppkey,i_ps_sup_part PRIMARY 8 NULL 176 Using where; Using index; LooseScan
|
||||||
|
1 PRIMARY lineitem ref i_l_suppkey_partkey,i_l_partkey i_l_partkey 5 dbt3_s001.partsupp_small.ps_partkey 30
|
||||||
|
explain format=json
|
||||||
|
delete from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
EXPLAIN
|
||||||
|
{
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 1,
|
||||||
|
"cost": 0.222764041,
|
||||||
|
"nested_loop": [
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "partsupp_small",
|
||||||
|
"access_type": "index",
|
||||||
|
"possible_keys": [
|
||||||
|
"PRIMARY",
|
||||||
|
"i_ps_partkey",
|
||||||
|
"i_ps_suppkey",
|
||||||
|
"i_ps_sup_part"
|
||||||
|
],
|
||||||
|
"key": "PRIMARY",
|
||||||
|
"key_length": "8",
|
||||||
|
"used_key_parts": ["ps_partkey", "ps_suppkey"],
|
||||||
|
"loops": 1,
|
||||||
|
"rows": 176,
|
||||||
|
"cost": 0.019403477,
|
||||||
|
"filtered": 23.86363602,
|
||||||
|
"attached_condition": "partsupp_small.ps_suppkey in (1,2,3)",
|
||||||
|
"using_index": true,
|
||||||
|
"loose_scan": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "lineitem",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": ["i_l_suppkey_partkey", "i_l_partkey"],
|
||||||
|
"key": "i_l_partkey",
|
||||||
|
"key_length": "5",
|
||||||
|
"used_key_parts": ["l_partkey"],
|
||||||
|
"ref": ["dbt3_s001.partsupp_small.ps_partkey"],
|
||||||
|
"loops": 42,
|
||||||
|
"rows": 30,
|
||||||
|
"cost": 0.203360564,
|
||||||
|
"filtered": 2.380952358
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
select count(*) from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
insert into lineitem select * from t;
|
||||||
|
select count(*) from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
count(*)
|
||||||
|
1175
|
||||||
|
drop table t;
|
||||||
|
# LooseScan PS
|
||||||
|
# ============
|
||||||
|
prepare stmt from "
|
||||||
|
delete from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
";
|
||||||
|
select count(*) from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
count(*)
|
||||||
|
1175
|
||||||
|
create table t as
|
||||||
|
select * from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
execute stmt;
|
||||||
|
select count(*) from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
insert into lineitem select * from t;
|
||||||
|
select count(*) from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
count(*)
|
||||||
|
1175
|
||||||
|
create table r as
|
||||||
|
select * from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
execute stmt;
|
||||||
|
select count(*) from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
insert into lineitem select * from r;
|
||||||
|
select count(*) from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
count(*)
|
||||||
|
1175
|
||||||
|
drop tables r, t;
|
||||||
|
deallocate prepare stmt;
|
||||||
|
# LooseScan SP
|
||||||
|
# ============
|
||||||
|
create procedure p()
|
||||||
|
delete from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
select count(*) from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
count(*)
|
||||||
|
1175
|
||||||
|
create table t as
|
||||||
|
select * from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
call p();
|
||||||
|
select count(*) from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
insert into lineitem select * from t;
|
||||||
|
select count(*) from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
count(*)
|
||||||
|
1175
|
||||||
|
create table r as
|
||||||
|
select * from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
call p();
|
||||||
|
select count(*) from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
insert into lineitem select * from r;
|
||||||
|
select count(*) from lineitem where l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
count(*)
|
||||||
|
1175
|
||||||
|
drop tables r, t;
|
||||||
|
drop procedure p;
|
||||||
|
# DuplicateWeedout
|
||||||
|
# ================
|
||||||
|
set @tmp_optimizer_switch= @@optimizer_switch;
|
||||||
|
set optimizer_switch='materialization=off';
|
||||||
|
analyze table lineitem;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
dbt3_s001.lineitem analyze status Engine-independent statistics collected
|
||||||
|
dbt3_s001.lineitem analyze status OK
|
||||||
|
analyze table orders;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
dbt3_s001.orders analyze status Engine-independent statistics collected
|
||||||
|
dbt3_s001.orders analyze status OK
|
||||||
|
explain
|
||||||
|
select count(*) from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY supplier range PRIMARY PRIMARY 4 NULL 1 Using where; Using index; Start temporary
|
||||||
|
1 PRIMARY partsupp_small ref PRIMARY,i_ps_partkey,i_ps_suppkey,i_ps_sup_part i_ps_sup_part 4 dbt3_s001.supplier.s_suppkey 17 Using where; Using index
|
||||||
|
1 PRIMARY lineitem ref i_l_suppkey_partkey,i_l_partkey i_l_suppkey_partkey 5 dbt3_s001.partsupp_small.ps_partkey 30 Using index
|
||||||
|
1 PRIMARY lineitem ref i_l_suppkey_partkey,i_l_partkey i_l_partkey 5 dbt3_s001.partsupp_small.ps_partkey 30 Using index; End temporary
|
||||||
|
explain format=json
|
||||||
|
select count(*) from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
EXPLAIN
|
||||||
|
{
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 1,
|
||||||
|
"cost": 4.129940741,
|
||||||
|
"nested_loop": [
|
||||||
|
{
|
||||||
|
"duplicates_removal": [
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "supplier",
|
||||||
|
"access_type": "range",
|
||||||
|
"possible_keys": ["PRIMARY"],
|
||||||
|
"key": "PRIMARY",
|
||||||
|
"key_length": "4",
|
||||||
|
"used_key_parts": ["s_suppkey"],
|
||||||
|
"loops": 1,
|
||||||
|
"rows": 1,
|
||||||
|
"cost": 0.001478954,
|
||||||
|
"filtered": 100,
|
||||||
|
"attached_condition": "supplier.s_suppkey < 2",
|
||||||
|
"using_index": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "partsupp_small",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": [
|
||||||
|
"PRIMARY",
|
||||||
|
"i_ps_partkey",
|
||||||
|
"i_ps_suppkey",
|
||||||
|
"i_ps_sup_part"
|
||||||
|
],
|
||||||
|
"key": "i_ps_sup_part",
|
||||||
|
"key_length": "4",
|
||||||
|
"used_key_parts": ["ps_suppkey"],
|
||||||
|
"ref": ["dbt3_s001.supplier.s_suppkey"],
|
||||||
|
"loops": 1,
|
||||||
|
"rows": 17,
|
||||||
|
"cost": 0.003160332,
|
||||||
|
"filtered": 79.54545593,
|
||||||
|
"attached_condition": "partsupp_small.ps_partkey is not null",
|
||||||
|
"using_index": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "lineitem",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": ["i_l_suppkey_partkey", "i_l_partkey"],
|
||||||
|
"key": "i_l_suppkey_partkey",
|
||||||
|
"key_length": "5",
|
||||||
|
"used_key_parts": ["l_partkey"],
|
||||||
|
"ref": ["dbt3_s001.partsupp_small.ps_partkey"],
|
||||||
|
"loops": 14,
|
||||||
|
"rows": 30,
|
||||||
|
"cost": 0.069152188,
|
||||||
|
"filtered": 100,
|
||||||
|
"using_index": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "lineitem",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": ["i_l_suppkey_partkey", "i_l_partkey"],
|
||||||
|
"key": "i_l_partkey",
|
||||||
|
"key_length": "5",
|
||||||
|
"used_key_parts": ["l_partkey"],
|
||||||
|
"ref": ["dbt3_s001.partsupp_small.ps_partkey"],
|
||||||
|
"loops": 420.35,
|
||||||
|
"rows": 30,
|
||||||
|
"cost": 1.994712365,
|
||||||
|
"filtered": 0.237896994,
|
||||||
|
"using_index": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
explain
|
||||||
|
select l_partkey from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY supplier range PRIMARY PRIMARY 4 NULL 1 Using where; Using index; Start temporary
|
||||||
|
1 PRIMARY partsupp_small ref PRIMARY,i_ps_partkey,i_ps_suppkey,i_ps_sup_part i_ps_sup_part 4 dbt3_s001.supplier.s_suppkey 17 Using where; Using index
|
||||||
|
1 PRIMARY lineitem ref i_l_suppkey_partkey,i_l_partkey i_l_suppkey_partkey 5 dbt3_s001.partsupp_small.ps_partkey 30 Using index
|
||||||
|
1 PRIMARY lineitem ref i_l_suppkey_partkey,i_l_partkey i_l_partkey 5 dbt3_s001.partsupp_small.ps_partkey 30 Using index; End temporary
|
||||||
|
explain format=json
|
||||||
|
select l_partkey from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
EXPLAIN
|
||||||
|
{
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 1,
|
||||||
|
"cost": 4.129940741,
|
||||||
|
"nested_loop": [
|
||||||
|
{
|
||||||
|
"duplicates_removal": [
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "supplier",
|
||||||
|
"access_type": "range",
|
||||||
|
"possible_keys": ["PRIMARY"],
|
||||||
|
"key": "PRIMARY",
|
||||||
|
"key_length": "4",
|
||||||
|
"used_key_parts": ["s_suppkey"],
|
||||||
|
"loops": 1,
|
||||||
|
"rows": 1,
|
||||||
|
"cost": 0.001478954,
|
||||||
|
"filtered": 100,
|
||||||
|
"attached_condition": "supplier.s_suppkey < 2",
|
||||||
|
"using_index": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "partsupp_small",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": [
|
||||||
|
"PRIMARY",
|
||||||
|
"i_ps_partkey",
|
||||||
|
"i_ps_suppkey",
|
||||||
|
"i_ps_sup_part"
|
||||||
|
],
|
||||||
|
"key": "i_ps_sup_part",
|
||||||
|
"key_length": "4",
|
||||||
|
"used_key_parts": ["ps_suppkey"],
|
||||||
|
"ref": ["dbt3_s001.supplier.s_suppkey"],
|
||||||
|
"loops": 1,
|
||||||
|
"rows": 17,
|
||||||
|
"cost": 0.003160332,
|
||||||
|
"filtered": 79.54545593,
|
||||||
|
"attached_condition": "partsupp_small.ps_partkey is not null",
|
||||||
|
"using_index": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "lineitem",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": ["i_l_suppkey_partkey", "i_l_partkey"],
|
||||||
|
"key": "i_l_suppkey_partkey",
|
||||||
|
"key_length": "5",
|
||||||
|
"used_key_parts": ["l_partkey"],
|
||||||
|
"ref": ["dbt3_s001.partsupp_small.ps_partkey"],
|
||||||
|
"loops": 14,
|
||||||
|
"rows": 30,
|
||||||
|
"cost": 0.069152188,
|
||||||
|
"filtered": 100,
|
||||||
|
"using_index": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "lineitem",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": ["i_l_suppkey_partkey", "i_l_partkey"],
|
||||||
|
"key": "i_l_partkey",
|
||||||
|
"key_length": "5",
|
||||||
|
"used_key_parts": ["l_partkey"],
|
||||||
|
"ref": ["dbt3_s001.partsupp_small.ps_partkey"],
|
||||||
|
"loops": 420.35,
|
||||||
|
"rows": 30,
|
||||||
|
"cost": 1.994712365,
|
||||||
|
"filtered": 0.237896994,
|
||||||
|
"using_index": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
select count(*) from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
count(*)
|
||||||
|
471
|
||||||
|
create table t as
|
||||||
|
select * from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
explain
|
||||||
|
delete from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY supplier range PRIMARY PRIMARY 4 NULL 1 Using where; Using index; Start temporary
|
||||||
|
1 PRIMARY partsupp_small ref PRIMARY,i_ps_partkey,i_ps_suppkey,i_ps_sup_part i_ps_sup_part 4 dbt3_s001.supplier.s_suppkey 17 Using where; Using index
|
||||||
|
1 PRIMARY lineitem ref i_l_suppkey_partkey,i_l_partkey i_l_suppkey_partkey 5 dbt3_s001.partsupp_small.ps_partkey 30
|
||||||
|
1 PRIMARY lineitem ref i_l_suppkey_partkey,i_l_partkey i_l_partkey 5 dbt3_s001.partsupp_small.ps_partkey 30 Using index; End temporary
|
||||||
|
explain format=json
|
||||||
|
delete from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
EXPLAIN
|
||||||
|
{
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 1,
|
||||||
|
"cost": 4.129940741,
|
||||||
|
"nested_loop": [
|
||||||
|
{
|
||||||
|
"duplicates_removal": [
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "supplier",
|
||||||
|
"access_type": "range",
|
||||||
|
"possible_keys": ["PRIMARY"],
|
||||||
|
"key": "PRIMARY",
|
||||||
|
"key_length": "4",
|
||||||
|
"used_key_parts": ["s_suppkey"],
|
||||||
|
"loops": 1,
|
||||||
|
"rows": 1,
|
||||||
|
"cost": 0.001478954,
|
||||||
|
"filtered": 100,
|
||||||
|
"attached_condition": "supplier.s_suppkey < 2",
|
||||||
|
"using_index": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "partsupp_small",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": [
|
||||||
|
"PRIMARY",
|
||||||
|
"i_ps_partkey",
|
||||||
|
"i_ps_suppkey",
|
||||||
|
"i_ps_sup_part"
|
||||||
|
],
|
||||||
|
"key": "i_ps_sup_part",
|
||||||
|
"key_length": "4",
|
||||||
|
"used_key_parts": ["ps_suppkey"],
|
||||||
|
"ref": ["dbt3_s001.supplier.s_suppkey"],
|
||||||
|
"loops": 1,
|
||||||
|
"rows": 17,
|
||||||
|
"cost": 0.003160332,
|
||||||
|
"filtered": 79.54545593,
|
||||||
|
"attached_condition": "partsupp_small.ps_partkey is not null",
|
||||||
|
"using_index": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "lineitem",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": ["i_l_suppkey_partkey", "i_l_partkey"],
|
||||||
|
"key": "i_l_suppkey_partkey",
|
||||||
|
"key_length": "5",
|
||||||
|
"used_key_parts": ["l_partkey"],
|
||||||
|
"ref": ["dbt3_s001.partsupp_small.ps_partkey"],
|
||||||
|
"loops": 14,
|
||||||
|
"rows": 30,
|
||||||
|
"cost": 0.069152188,
|
||||||
|
"filtered": 100
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "lineitem",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": ["i_l_suppkey_partkey", "i_l_partkey"],
|
||||||
|
"key": "i_l_partkey",
|
||||||
|
"key_length": "5",
|
||||||
|
"used_key_parts": ["l_partkey"],
|
||||||
|
"ref": ["dbt3_s001.partsupp_small.ps_partkey"],
|
||||||
|
"loops": 420.35,
|
||||||
|
"rows": 30,
|
||||||
|
"cost": 1.994712365,
|
||||||
|
"filtered": 0.237896994,
|
||||||
|
"using_index": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
select count(*) from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
insert into lineitem select * from t;
|
||||||
|
select count(*) from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
count(*)
|
||||||
|
471
|
||||||
|
drop table t;
|
||||||
|
# DuplicateWeedout PS
|
||||||
|
# ===================
|
||||||
|
prepare stmt from "
|
||||||
|
delete from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
";
|
||||||
|
select count(*) from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
count(*)
|
||||||
|
471
|
||||||
|
create table t as
|
||||||
|
select * from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
execute stmt;
|
||||||
|
select count(*) from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
insert into lineitem select * from t;
|
||||||
|
select count(*) from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
count(*)
|
||||||
|
471
|
||||||
|
create table r as
|
||||||
|
select * from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
execute stmt;
|
||||||
|
select count(*) from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
insert into lineitem select * from r;
|
||||||
|
select count(*) from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
count(*)
|
||||||
|
471
|
||||||
|
drop tables r, t;
|
||||||
|
deallocate prepare stmt;
|
||||||
|
# DuplicateWeedout SP
|
||||||
|
# ===================
|
||||||
|
create procedure p()
|
||||||
|
delete from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
select count(*) from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
count(*)
|
||||||
|
471
|
||||||
|
create table t as
|
||||||
|
select * from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
call p();
|
||||||
|
select count(*) from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
insert into lineitem select * from t;
|
||||||
|
select count(*) from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
count(*)
|
||||||
|
471
|
||||||
|
create table r as
|
||||||
|
select * from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
call p();
|
||||||
|
select count(*) from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
insert into lineitem select * from r;
|
||||||
|
select count(*) from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
count(*)
|
||||||
|
471
|
||||||
|
drop tables r, t;
|
||||||
|
drop procedure p;
|
||||||
|
set @@optimizer_switch=@tmp_optimizer_switch;
|
||||||
|
drop table partsupp_small;
|
||||||
DROP DATABASE dbt3_s001;
|
DROP DATABASE dbt3_s001;
|
||||||
|
@ -822,4 +822,248 @@ eval
|
|||||||
select o_orderkey, o_totalprice from orders where $c11;
|
select o_orderkey, o_totalprice from orders where $c11;
|
||||||
drop table t;
|
drop table t;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE partsupp_small (
|
||||||
|
ps_partkey int(11) NOT NULL DEFAULT '0',
|
||||||
|
ps_suppkey int(11) NOT NULL DEFAULT '0',
|
||||||
|
ps_availqty int(11) DEFAULT NULL,
|
||||||
|
ps_supplycost double DEFAULT NULL,
|
||||||
|
ps_comment varchar(199) DEFAULT NULL,
|
||||||
|
PRIMARY KEY (ps_partkey,ps_suppkey),
|
||||||
|
KEY i_ps_partkey (ps_partkey),
|
||||||
|
KEY i_ps_suppkey (ps_suppkey)
|
||||||
|
);
|
||||||
|
|
||||||
|
create index i_ps_sup_part on partsupp_small(ps_suppkey, ps_partkey);
|
||||||
|
insert into partsupp_small select * from partsupp where ps_partkey <50;
|
||||||
|
analyze table partsupp_small persistent for all;
|
||||||
|
|
||||||
|
--echo # LooseScan
|
||||||
|
--echo # =========
|
||||||
|
|
||||||
|
let $c12 = l_partkey in
|
||||||
|
(select ps_partkey from partsupp_small
|
||||||
|
where ps_suppkey in (1,2,3));
|
||||||
|
|
||||||
|
eval
|
||||||
|
explain
|
||||||
|
select count(*) from lineitem where $c12;
|
||||||
|
eval
|
||||||
|
explain format=json
|
||||||
|
select count(*) from lineitem where $c12;
|
||||||
|
eval
|
||||||
|
explain
|
||||||
|
select l_partkey from lineitem where $c12;
|
||||||
|
eval
|
||||||
|
explain format=json
|
||||||
|
select l_partkey from lineitem where $c12;
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c12;
|
||||||
|
eval
|
||||||
|
create table t as
|
||||||
|
select * from lineitem where $c12;
|
||||||
|
|
||||||
|
eval
|
||||||
|
explain
|
||||||
|
delete from lineitem where $c12;
|
||||||
|
eval
|
||||||
|
explain format=json
|
||||||
|
delete from lineitem where $c12;
|
||||||
|
eval
|
||||||
|
delete from lineitem where $c12;
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c12;
|
||||||
|
|
||||||
|
insert into lineitem select * from t;
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c12;
|
||||||
|
|
||||||
|
drop table t;
|
||||||
|
|
||||||
|
--echo # LooseScan PS
|
||||||
|
--echo # ============
|
||||||
|
|
||||||
|
eval
|
||||||
|
prepare stmt from "
|
||||||
|
delete from lineitem where $c12;
|
||||||
|
";
|
||||||
|
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c12;
|
||||||
|
eval
|
||||||
|
create table t as
|
||||||
|
select * from lineitem where $c12;
|
||||||
|
execute stmt;
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c12;
|
||||||
|
insert into lineitem select * from t;
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c12;
|
||||||
|
|
||||||
|
eval
|
||||||
|
create table r as
|
||||||
|
select * from lineitem where $c12;
|
||||||
|
execute stmt;
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c12;
|
||||||
|
insert into lineitem select * from r;
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c12;
|
||||||
|
|
||||||
|
drop tables r, t;
|
||||||
|
deallocate prepare stmt;
|
||||||
|
|
||||||
|
--echo # LooseScan SP
|
||||||
|
--echo # ============
|
||||||
|
|
||||||
|
eval
|
||||||
|
create procedure p()
|
||||||
|
delete from lineitem where $c12;
|
||||||
|
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c12;
|
||||||
|
eval
|
||||||
|
create table t as
|
||||||
|
select * from lineitem where $c12;
|
||||||
|
call p();
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c12;
|
||||||
|
insert into lineitem select * from t;
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c12;
|
||||||
|
|
||||||
|
eval
|
||||||
|
create table r as
|
||||||
|
select * from lineitem where $c12;
|
||||||
|
call p();
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c12;
|
||||||
|
insert into lineitem select * from r;
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c12;
|
||||||
|
|
||||||
|
drop tables r, t;
|
||||||
|
drop procedure p;
|
||||||
|
|
||||||
|
--echo # DuplicateWeedout
|
||||||
|
--echo # ================
|
||||||
|
|
||||||
|
set @tmp_optimizer_switch= @@optimizer_switch;
|
||||||
|
set optimizer_switch='materialization=off';
|
||||||
|
|
||||||
|
analyze table lineitem;
|
||||||
|
analyze table orders;
|
||||||
|
|
||||||
|
let $c13 = l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
eval
|
||||||
|
explain
|
||||||
|
select count(*) from lineitem where $c13;
|
||||||
|
eval
|
||||||
|
explain format=json
|
||||||
|
select count(*) from lineitem where $c13;
|
||||||
|
eval
|
||||||
|
explain
|
||||||
|
select l_partkey from lineitem where $c13;
|
||||||
|
eval
|
||||||
|
explain format=json
|
||||||
|
select l_partkey from lineitem where $c13;
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c13;
|
||||||
|
eval
|
||||||
|
create table t as
|
||||||
|
select * from lineitem where $c13;
|
||||||
|
|
||||||
|
eval
|
||||||
|
explain
|
||||||
|
delete from lineitem where $c13;
|
||||||
|
eval
|
||||||
|
explain format=json
|
||||||
|
delete from lineitem where $c13;
|
||||||
|
eval
|
||||||
|
delete from lineitem where $c13;
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c13;
|
||||||
|
|
||||||
|
insert into lineitem select * from t;
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c13;
|
||||||
|
|
||||||
|
drop table t;
|
||||||
|
|
||||||
|
--echo # DuplicateWeedout PS
|
||||||
|
--echo # ===================
|
||||||
|
|
||||||
|
eval
|
||||||
|
prepare stmt from "
|
||||||
|
delete from lineitem where $c13;
|
||||||
|
";
|
||||||
|
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c13;
|
||||||
|
eval
|
||||||
|
create table t as
|
||||||
|
select * from lineitem where $c13;
|
||||||
|
execute stmt;
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c13;
|
||||||
|
insert into lineitem select * from t;
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c13;
|
||||||
|
|
||||||
|
eval
|
||||||
|
create table r as
|
||||||
|
select * from lineitem where $c13;
|
||||||
|
execute stmt;
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c13;
|
||||||
|
insert into lineitem select * from r;
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c13;
|
||||||
|
|
||||||
|
drop tables r, t;
|
||||||
|
deallocate prepare stmt;
|
||||||
|
|
||||||
|
--echo # DuplicateWeedout SP
|
||||||
|
--echo # ===================
|
||||||
|
|
||||||
|
eval
|
||||||
|
create procedure p()
|
||||||
|
delete from lineitem where $c13;
|
||||||
|
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c13;
|
||||||
|
eval
|
||||||
|
create table t as
|
||||||
|
select * from lineitem where $c13;
|
||||||
|
call p();
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c13;
|
||||||
|
insert into lineitem select * from t;
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c13;
|
||||||
|
|
||||||
|
eval
|
||||||
|
create table r as
|
||||||
|
select * from lineitem where $c13;
|
||||||
|
call p();
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c13;
|
||||||
|
insert into lineitem select * from r;
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c13;
|
||||||
|
|
||||||
|
drop tables r, t;
|
||||||
|
drop procedure p;
|
||||||
|
|
||||||
|
set @@optimizer_switch=@tmp_optimizer_switch;
|
||||||
|
|
||||||
|
drop table partsupp_small;
|
||||||
|
|
||||||
DROP DATABASE dbt3_s001;
|
DROP DATABASE dbt3_s001;
|
||||||
|
8870
mysql-test/main/delete_use_source_engines.result
Normal file
8870
mysql-test/main/delete_use_source_engines.result
Normal file
File diff suppressed because it is too large
Load Diff
42
mysql-test/main/delete_use_source_engines.test
Normal file
42
mysql-test/main/delete_use_source_engines.test
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
--source include/have_innodb.inc
|
||||||
|
|
||||||
|
set @save_default_engine=@@default_storage_engine;
|
||||||
|
|
||||||
|
--echo #######################################
|
||||||
|
--echo # #
|
||||||
|
--echo # Engine InnoDB #
|
||||||
|
--echo # #
|
||||||
|
--echo #######################################
|
||||||
|
set global innodb_stats_persistent=1;
|
||||||
|
set default_storage_engine=InnoDB;
|
||||||
|
--source include/delete_use_source_innodb.inc
|
||||||
|
|
||||||
|
--echo #######################################
|
||||||
|
--echo # #
|
||||||
|
--echo # Engine Aria #
|
||||||
|
--echo # #
|
||||||
|
--echo #######################################
|
||||||
|
set default_storage_engine=Aria;
|
||||||
|
--source include/delete_use_source.inc
|
||||||
|
|
||||||
|
--echo #######################################
|
||||||
|
--echo # #
|
||||||
|
--echo # Engine MyISAM #
|
||||||
|
--echo # #
|
||||||
|
--echo #######################################
|
||||||
|
set default_storage_engine=MyISAM;
|
||||||
|
--source include/delete_use_source.inc
|
||||||
|
|
||||||
|
--echo #######################################
|
||||||
|
--echo # #
|
||||||
|
--echo # Engine MEMORY #
|
||||||
|
--echo # #
|
||||||
|
--echo #######################################
|
||||||
|
set default_storage_engine=MEMORY;
|
||||||
|
--source include/delete_use_source_memory.inc
|
||||||
|
|
||||||
|
set @@default_storage_engine=@save_default_engine;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 11.0 tests
|
||||||
|
--echo #
|
@ -3242,4 +3242,619 @@ o_orderkey o_totalprice
|
|||||||
3139 40975.96
|
3139 40975.96
|
||||||
4903 34363.63
|
4903 34363.63
|
||||||
5607 24660.06
|
5607 24660.06
|
||||||
|
CREATE TABLE partsupp_small (
|
||||||
|
ps_partkey int(11) NOT NULL DEFAULT '0',
|
||||||
|
ps_suppkey int(11) NOT NULL DEFAULT '0',
|
||||||
|
ps_availqty int(11) DEFAULT NULL,
|
||||||
|
ps_supplycost double DEFAULT NULL,
|
||||||
|
ps_comment varchar(199) DEFAULT NULL,
|
||||||
|
PRIMARY KEY (ps_partkey,ps_suppkey),
|
||||||
|
KEY i_ps_partkey (ps_partkey),
|
||||||
|
KEY i_ps_suppkey (ps_suppkey)
|
||||||
|
);
|
||||||
|
create index i_ps_sup_part on partsupp_small(ps_suppkey, ps_partkey);
|
||||||
|
insert into partsupp_small select * from partsupp where ps_partkey <50;
|
||||||
|
analyze table partsupp_small persistent for all;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
dbt3_s001.partsupp_small analyze status Engine-independent statistics collected
|
||||||
|
dbt3_s001.partsupp_small analyze status OK
|
||||||
|
# LooseScan
|
||||||
|
# =========
|
||||||
|
explain
|
||||||
|
select count(*) from lineitem where l_suppkey in
|
||||||
|
(select ps_suppkey from partsupp_small
|
||||||
|
where ps_partkey in (1,2,3));
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY partsupp_small index PRIMARY,i_ps_partkey,i_ps_suppkey,i_ps_sup_part i_ps_sup_part 8 NULL 176 Using where; Using index; LooseScan
|
||||||
|
1 PRIMARY lineitem ref i_l_suppkey i_l_suppkey 5 dbt3_s001.partsupp_small.ps_suppkey 600 Using index
|
||||||
|
explain format=json
|
||||||
|
select count(*) from lineitem where l_suppkey in
|
||||||
|
(select ps_suppkey from partsupp_small
|
||||||
|
where ps_partkey in (1,2,3));
|
||||||
|
EXPLAIN
|
||||||
|
{
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 1,
|
||||||
|
"cost": 0.776623555,
|
||||||
|
"nested_loop": [
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "partsupp_small",
|
||||||
|
"access_type": "index",
|
||||||
|
"possible_keys": [
|
||||||
|
"PRIMARY",
|
||||||
|
"i_ps_partkey",
|
||||||
|
"i_ps_suppkey",
|
||||||
|
"i_ps_sup_part"
|
||||||
|
],
|
||||||
|
"key": "i_ps_sup_part",
|
||||||
|
"key_length": "8",
|
||||||
|
"used_key_parts": ["ps_suppkey", "ps_partkey"],
|
||||||
|
"loops": 1,
|
||||||
|
"rows": 176,
|
||||||
|
"cost": 0.019403477,
|
||||||
|
"filtered": 5.113636494,
|
||||||
|
"attached_condition": "partsupp_small.ps_partkey in (1,2,3)",
|
||||||
|
"using_index": true,
|
||||||
|
"loose_scan": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "lineitem",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": ["i_l_suppkey"],
|
||||||
|
"key": "i_l_suppkey",
|
||||||
|
"key_length": "5",
|
||||||
|
"used_key_parts": ["l_suppkey"],
|
||||||
|
"ref": ["dbt3_s001.partsupp_small.ps_suppkey"],
|
||||||
|
"loops": 9,
|
||||||
|
"rows": 600,
|
||||||
|
"cost": 0.757220078,
|
||||||
|
"filtered": 11.11111069,
|
||||||
|
"using_index": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
select count(*) from lineitem where l_suppkey in
|
||||||
|
(select ps_suppkey from partsupp_small
|
||||||
|
where ps_partkey in (1,2,3));
|
||||||
|
count(*)
|
||||||
|
5373
|
||||||
|
select 5373 as count, 136458704.22 as old_sum;
|
||||||
|
count old_sum
|
||||||
|
5373 136458704.22
|
||||||
|
explain
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice+10 where l_suppkey in
|
||||||
|
(select ps_suppkey from partsupp_small
|
||||||
|
where ps_partkey in (1,2,3));
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY lineitem ALL i_l_suppkey NULL NULL NULL 6005
|
||||||
|
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1
|
||||||
|
2 MATERIALIZED partsupp_small range PRIMARY,i_ps_partkey,i_ps_suppkey,i_ps_sup_part PRIMARY 4 NULL 9 Using where; Using index
|
||||||
|
explain format=json
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice+10 where l_suppkey in
|
||||||
|
(select ps_suppkey from partsupp_small
|
||||||
|
where ps_partkey in (1,2,3));
|
||||||
|
EXPLAIN
|
||||||
|
{
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 1,
|
||||||
|
"cost": 2.191459679,
|
||||||
|
"nested_loop": [
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "lineitem",
|
||||||
|
"access_type": "ALL",
|
||||||
|
"possible_keys": ["i_l_suppkey"],
|
||||||
|
"loops": 1,
|
||||||
|
"rows": 6005,
|
||||||
|
"cost": 0.988432825,
|
||||||
|
"filtered": 100
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "<subquery2>",
|
||||||
|
"access_type": "eq_ref",
|
||||||
|
"possible_keys": ["distinct_key"],
|
||||||
|
"key": "distinct_key",
|
||||||
|
"key_length": "4",
|
||||||
|
"used_key_parts": ["ps_suppkey"],
|
||||||
|
"ref": ["func"],
|
||||||
|
"rows": 1,
|
||||||
|
"filtered": 100,
|
||||||
|
"materialized": {
|
||||||
|
"unique": 1,
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 2,
|
||||||
|
"nested_loop": [
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "partsupp_small",
|
||||||
|
"access_type": "range",
|
||||||
|
"possible_keys": [
|
||||||
|
"PRIMARY",
|
||||||
|
"i_ps_partkey",
|
||||||
|
"i_ps_suppkey",
|
||||||
|
"i_ps_sup_part"
|
||||||
|
],
|
||||||
|
"key": "PRIMARY",
|
||||||
|
"key_length": "4",
|
||||||
|
"used_key_parts": ["ps_partkey"],
|
||||||
|
"loops": 1,
|
||||||
|
"rows": 9,
|
||||||
|
"cost": 0.003756598,
|
||||||
|
"filtered": 100,
|
||||||
|
"attached_condition": "partsupp_small.ps_partkey in (1,2,3)",
|
||||||
|
"using_index": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice+10 where l_suppkey in
|
||||||
|
(select ps_suppkey from partsupp_small
|
||||||
|
where ps_partkey in (1,2,3));
|
||||||
|
select ROUND(sum(l_extendedprice),2), 5373 as count,
|
||||||
|
(136458704.22+10*5373) as 'old_sum+10*count'
|
||||||
|
from lineitem where l_suppkey in
|
||||||
|
(select ps_suppkey from partsupp_small
|
||||||
|
where ps_partkey in (1,2,3));
|
||||||
|
ROUND(sum(l_extendedprice),2) count old_sum+10*count
|
||||||
|
136512434.22 5373 136512434.22
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice-10 where l_suppkey in
|
||||||
|
(select ps_suppkey from partsupp_small
|
||||||
|
where ps_partkey in (1,2,3));
|
||||||
|
select ROUND(sum(l_extendedprice),2), 5373 as count,
|
||||||
|
136458704.22 as old_sum from lineitem where l_suppkey in
|
||||||
|
(select ps_suppkey from partsupp_small
|
||||||
|
where ps_partkey in (1,2,3));
|
||||||
|
ROUND(sum(l_extendedprice),2) count old_sum
|
||||||
|
136458704.22 5373 136458704.22
|
||||||
|
# LooseScan PS
|
||||||
|
# ============
|
||||||
|
prepare stmt from "
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice+? where l_suppkey in
|
||||||
|
(select ps_suppkey from partsupp_small
|
||||||
|
where ps_partkey in (1,2,3));
|
||||||
|
";
|
||||||
|
select 5373 as count, 136458704.22 as old_sum;
|
||||||
|
count old_sum
|
||||||
|
5373 136458704.22
|
||||||
|
set @a1=20;
|
||||||
|
execute stmt using @a1;
|
||||||
|
select ROUND(sum(l_extendedprice),2), 5373 as count,
|
||||||
|
(136458704.22+20*5373) as 'old_sum+20*count'
|
||||||
|
from lineitem where l_suppkey in
|
||||||
|
(select ps_suppkey from partsupp_small
|
||||||
|
where ps_partkey in (1,2,3));
|
||||||
|
ROUND(sum(l_extendedprice),2) count old_sum+20*count
|
||||||
|
136566164.22 5373 136566164.22
|
||||||
|
set @a2=10;
|
||||||
|
execute stmt using @a2;
|
||||||
|
select ROUND(sum(l_extendedprice),2), 5373 as count,
|
||||||
|
(136458704.22+30*5373) as 'old_sum+30*count'
|
||||||
|
from lineitem where l_suppkey in
|
||||||
|
(select ps_suppkey from partsupp_small
|
||||||
|
where ps_partkey in (1,2,3));
|
||||||
|
ROUND(sum(l_extendedprice),2) count old_sum+30*count
|
||||||
|
136619894.22 5373 136619894.22
|
||||||
|
execute stmt using -(@a1+@a2);
|
||||||
|
select ROUND(sum(l_extendedprice),2), 5373 as count,
|
||||||
|
136458704.22 as old_sum from lineitem where l_suppkey in
|
||||||
|
(select ps_suppkey from partsupp_small
|
||||||
|
where ps_partkey in (1,2,3));
|
||||||
|
ROUND(sum(l_extendedprice),2) count old_sum
|
||||||
|
136458704.22 5373 136458704.22
|
||||||
|
deallocate prepare stmt;
|
||||||
|
# LooseScan SP
|
||||||
|
# ============
|
||||||
|
create procedure p(d int)
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice+d where l_suppkey in
|
||||||
|
(select ps_suppkey from partsupp_small
|
||||||
|
where ps_partkey in (1,2,3));
|
||||||
|
select 5373 as count, 136458704.22 as old_sum;
|
||||||
|
count old_sum
|
||||||
|
5373 136458704.22
|
||||||
|
call p(10);
|
||||||
|
select ROUND(sum(l_extendedprice),2), 5373 as count,
|
||||||
|
(136458704.22+10*5373) as 'old_sum+10*count'
|
||||||
|
from lineitem where l_suppkey in
|
||||||
|
(select ps_suppkey from partsupp_small
|
||||||
|
where ps_partkey in (1,2,3));
|
||||||
|
ROUND(sum(l_extendedprice),2) count old_sum+10*count
|
||||||
|
136512434.22 5373 136512434.22
|
||||||
|
call p(20);
|
||||||
|
select ROUND(sum(l_extendedprice),2), 5373 as count,
|
||||||
|
(136458704.22+30*5373) as 'old_sum+30*count'
|
||||||
|
from lineitem where l_suppkey in
|
||||||
|
(select ps_suppkey from partsupp_small
|
||||||
|
where ps_partkey in (1,2,3));
|
||||||
|
ROUND(sum(l_extendedprice),2) count old_sum+30*count
|
||||||
|
136619894.22 5373 136619894.22
|
||||||
|
call p(-(10+20));
|
||||||
|
select ROUND(sum(l_extendedprice),2), 5373 as count,
|
||||||
|
136458704.22 as old_sum from lineitem where l_suppkey in
|
||||||
|
(select ps_suppkey from partsupp_small
|
||||||
|
where ps_partkey in (1,2,3));
|
||||||
|
ROUND(sum(l_extendedprice),2) count old_sum
|
||||||
|
136458704.22 5373 136458704.22
|
||||||
|
drop procedure p;
|
||||||
|
# DuplicateWeedout
|
||||||
|
# ================
|
||||||
|
set @tmp_optimizer_switch= @@optimizer_switch;
|
||||||
|
set optimizer_switch='materialization=off';
|
||||||
|
analyze table lineitem;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
dbt3_s001.lineitem analyze status Engine-independent statistics collected
|
||||||
|
dbt3_s001.lineitem analyze status OK
|
||||||
|
analyze table orders;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
dbt3_s001.orders analyze status Engine-independent statistics collected
|
||||||
|
dbt3_s001.orders analyze status OK
|
||||||
|
explain
|
||||||
|
select count(*) from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY supplier range PRIMARY PRIMARY 4 NULL 1 Using where; Using index; Start temporary
|
||||||
|
1 PRIMARY partsupp_small ref PRIMARY,i_ps_partkey,i_ps_suppkey,i_ps_sup_part i_ps_sup_part 4 dbt3_s001.supplier.s_suppkey 17 Using where; Using index
|
||||||
|
1 PRIMARY lineitem ref i_l_suppkey_partkey,i_l_partkey i_l_suppkey_partkey 5 dbt3_s001.partsupp_small.ps_partkey 30 Using index
|
||||||
|
1 PRIMARY lineitem ref i_l_suppkey_partkey,i_l_partkey i_l_partkey 5 dbt3_s001.partsupp_small.ps_partkey 30 Using index; End temporary
|
||||||
|
explain format=json
|
||||||
|
select count(*) from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
EXPLAIN
|
||||||
|
{
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 1,
|
||||||
|
"cost": 4.129940741,
|
||||||
|
"nested_loop": [
|
||||||
|
{
|
||||||
|
"duplicates_removal": [
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "supplier",
|
||||||
|
"access_type": "range",
|
||||||
|
"possible_keys": ["PRIMARY"],
|
||||||
|
"key": "PRIMARY",
|
||||||
|
"key_length": "4",
|
||||||
|
"used_key_parts": ["s_suppkey"],
|
||||||
|
"loops": 1,
|
||||||
|
"rows": 1,
|
||||||
|
"cost": 0.001478954,
|
||||||
|
"filtered": 100,
|
||||||
|
"attached_condition": "supplier.s_suppkey < 2",
|
||||||
|
"using_index": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "partsupp_small",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": [
|
||||||
|
"PRIMARY",
|
||||||
|
"i_ps_partkey",
|
||||||
|
"i_ps_suppkey",
|
||||||
|
"i_ps_sup_part"
|
||||||
|
],
|
||||||
|
"key": "i_ps_sup_part",
|
||||||
|
"key_length": "4",
|
||||||
|
"used_key_parts": ["ps_suppkey"],
|
||||||
|
"ref": ["dbt3_s001.supplier.s_suppkey"],
|
||||||
|
"loops": 1,
|
||||||
|
"rows": 17,
|
||||||
|
"cost": 0.003160332,
|
||||||
|
"filtered": 79.54545593,
|
||||||
|
"attached_condition": "partsupp_small.ps_partkey is not null",
|
||||||
|
"using_index": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "lineitem",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": ["i_l_suppkey_partkey", "i_l_partkey"],
|
||||||
|
"key": "i_l_suppkey_partkey",
|
||||||
|
"key_length": "5",
|
||||||
|
"used_key_parts": ["l_partkey"],
|
||||||
|
"ref": ["dbt3_s001.partsupp_small.ps_partkey"],
|
||||||
|
"loops": 14,
|
||||||
|
"rows": 30,
|
||||||
|
"cost": 0.069152188,
|
||||||
|
"filtered": 100,
|
||||||
|
"using_index": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "lineitem",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": ["i_l_suppkey_partkey", "i_l_partkey"],
|
||||||
|
"key": "i_l_partkey",
|
||||||
|
"key_length": "5",
|
||||||
|
"used_key_parts": ["l_partkey"],
|
||||||
|
"ref": ["dbt3_s001.partsupp_small.ps_partkey"],
|
||||||
|
"loops": 420.35,
|
||||||
|
"rows": 30,
|
||||||
|
"cost": 1.994712365,
|
||||||
|
"filtered": 0.237896994,
|
||||||
|
"using_index": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
select count(*) from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
count(*)
|
||||||
|
471
|
||||||
|
select 471 as count, 10751458.66 as old_sum;
|
||||||
|
count old_sum
|
||||||
|
471 10751458.66
|
||||||
|
explain
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice+10 where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY supplier range PRIMARY PRIMARY 4 NULL 1 Using where; Using index; Start temporary
|
||||||
|
1 PRIMARY partsupp_small ref PRIMARY,i_ps_partkey,i_ps_suppkey,i_ps_sup_part i_ps_sup_part 4 dbt3_s001.supplier.s_suppkey 17 Using where; Using index
|
||||||
|
1 PRIMARY lineitem ref i_l_suppkey_partkey,i_l_partkey i_l_suppkey_partkey 5 dbt3_s001.partsupp_small.ps_partkey 30
|
||||||
|
1 PRIMARY lineitem ref i_l_suppkey_partkey,i_l_partkey i_l_partkey 5 dbt3_s001.partsupp_small.ps_partkey 30 Using index; End temporary
|
||||||
|
explain format=json
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice+10 where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
EXPLAIN
|
||||||
|
{
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 1,
|
||||||
|
"cost": 4.590092321,
|
||||||
|
"nested_loop": [
|
||||||
|
{
|
||||||
|
"duplicates_removal": [
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "supplier",
|
||||||
|
"access_type": "range",
|
||||||
|
"possible_keys": ["PRIMARY"],
|
||||||
|
"key": "PRIMARY",
|
||||||
|
"key_length": "4",
|
||||||
|
"used_key_parts": ["s_suppkey"],
|
||||||
|
"loops": 1,
|
||||||
|
"rows": 1,
|
||||||
|
"cost": 0.001478954,
|
||||||
|
"filtered": 100,
|
||||||
|
"attached_condition": "supplier.s_suppkey < 2",
|
||||||
|
"using_index": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "partsupp_small",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": [
|
||||||
|
"PRIMARY",
|
||||||
|
"i_ps_partkey",
|
||||||
|
"i_ps_suppkey",
|
||||||
|
"i_ps_sup_part"
|
||||||
|
],
|
||||||
|
"key": "i_ps_sup_part",
|
||||||
|
"key_length": "4",
|
||||||
|
"used_key_parts": ["ps_suppkey"],
|
||||||
|
"ref": ["dbt3_s001.supplier.s_suppkey"],
|
||||||
|
"loops": 1,
|
||||||
|
"rows": 17,
|
||||||
|
"cost": 0.003160332,
|
||||||
|
"filtered": 79.54545593,
|
||||||
|
"attached_condition": "partsupp_small.ps_partkey is not null",
|
||||||
|
"using_index": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "lineitem",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": ["i_l_suppkey_partkey", "i_l_partkey"],
|
||||||
|
"key": "i_l_suppkey_partkey",
|
||||||
|
"key_length": "5",
|
||||||
|
"used_key_parts": ["l_partkey"],
|
||||||
|
"ref": ["dbt3_s001.partsupp_small.ps_partkey"],
|
||||||
|
"loops": 14,
|
||||||
|
"rows": 30,
|
||||||
|
"cost": 0.529303768,
|
||||||
|
"filtered": 100
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "lineitem",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": ["i_l_suppkey_partkey", "i_l_partkey"],
|
||||||
|
"key": "i_l_partkey",
|
||||||
|
"key_length": "5",
|
||||||
|
"used_key_parts": ["l_partkey"],
|
||||||
|
"ref": ["dbt3_s001.partsupp_small.ps_partkey"],
|
||||||
|
"loops": 420.35,
|
||||||
|
"rows": 30,
|
||||||
|
"cost": 1.994712365,
|
||||||
|
"filtered": 0.237896994,
|
||||||
|
"using_index": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice+10 where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
select ROUND(sum(l_extendedprice),2), 471 as count,
|
||||||
|
(10751458.66+10*471) as 'old_sum+10*count'
|
||||||
|
from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
ROUND(sum(l_extendedprice),2) count old_sum+10*count
|
||||||
|
10756168.66 471 10756168.66
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice-10 where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
select ROUND(sum(l_extendedprice),2), 471 as count,
|
||||||
|
10751458.66 as old_sum from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
ROUND(sum(l_extendedprice),2) count old_sum
|
||||||
|
10751458.66 471 10751458.66
|
||||||
|
# DuplicateWeedout PS
|
||||||
|
# ===================
|
||||||
|
prepare stmt from "
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice+? where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
";
|
||||||
|
select 471 as count, 10751458.66 as old_sum;
|
||||||
|
count old_sum
|
||||||
|
471 10751458.66
|
||||||
|
set @a1=20;
|
||||||
|
execute stmt using @a1;
|
||||||
|
select ROUND(sum(l_extendedprice),2), 471 as count,
|
||||||
|
(10751458.66+20*471) as 'old_sum+20*count'
|
||||||
|
from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
ROUND(sum(l_extendedprice),2) count old_sum+20*count
|
||||||
|
10760878.66 471 10760878.66
|
||||||
|
set @a2=10;
|
||||||
|
execute stmt using @a2;
|
||||||
|
select ROUND(sum(l_extendedprice),2), 471 as count,
|
||||||
|
(10751458.66+30*471) as 'old_sum+30*count'
|
||||||
|
from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
ROUND(sum(l_extendedprice),2) count old_sum+30*count
|
||||||
|
10765588.66 471 10765588.66
|
||||||
|
execute stmt using -(@a1+@a2);
|
||||||
|
select ROUND(sum(l_extendedprice),2), 471 as count,
|
||||||
|
10751458.66 as old_sum from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
ROUND(sum(l_extendedprice),2) count old_sum
|
||||||
|
10751458.66 471 10751458.66
|
||||||
|
deallocate prepare stmt;
|
||||||
|
# DuplicateWeedout SP
|
||||||
|
# ===================
|
||||||
|
create procedure p(d int)
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice+d where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
select 471 as count, 10751458.66 as old_sum;
|
||||||
|
count old_sum
|
||||||
|
471 10751458.66
|
||||||
|
call p(10);
|
||||||
|
select ROUND(sum(l_extendedprice),2), 471 as count,
|
||||||
|
(10751458.66+10*471) as 'old_sum+10*count'
|
||||||
|
from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
ROUND(sum(l_extendedprice),2) count old_sum+10*count
|
||||||
|
10756168.66 471 10756168.66
|
||||||
|
call p(20);
|
||||||
|
select ROUND(sum(l_extendedprice),2), 471 as count,
|
||||||
|
(10751458.66+30*471) as 'old_sum+30*count'
|
||||||
|
from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
ROUND(sum(l_extendedprice),2) count old_sum+30*count
|
||||||
|
10765588.66 471 10765588.66
|
||||||
|
call p(-(10+20));
|
||||||
|
select ROUND(sum(l_extendedprice),2), 471 as count,
|
||||||
|
10751458.66 as old_sum from lineitem where l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
ROUND(sum(l_extendedprice),2) count old_sum
|
||||||
|
10751458.66 471 10751458.66
|
||||||
|
drop procedure p;
|
||||||
|
set @@optimizer_switch=@tmp_optimizer_switch;
|
||||||
|
drop table partsupp_small;
|
||||||
DROP DATABASE dbt3_s001;
|
DROP DATABASE dbt3_s001;
|
||||||
|
@ -587,4 +587,246 @@ update orders set o_totalprice = o_totalprice+50 where $c11;
|
|||||||
eval
|
eval
|
||||||
select o_orderkey, o_totalprice from orders where $c11;
|
select o_orderkey, o_totalprice from orders where $c11;
|
||||||
|
|
||||||
|
CREATE TABLE partsupp_small (
|
||||||
|
ps_partkey int(11) NOT NULL DEFAULT '0',
|
||||||
|
ps_suppkey int(11) NOT NULL DEFAULT '0',
|
||||||
|
ps_availqty int(11) DEFAULT NULL,
|
||||||
|
ps_supplycost double DEFAULT NULL,
|
||||||
|
ps_comment varchar(199) DEFAULT NULL,
|
||||||
|
PRIMARY KEY (ps_partkey,ps_suppkey),
|
||||||
|
KEY i_ps_partkey (ps_partkey),
|
||||||
|
KEY i_ps_suppkey (ps_suppkey)
|
||||||
|
);
|
||||||
|
|
||||||
|
create index i_ps_sup_part on partsupp_small(ps_suppkey, ps_partkey);
|
||||||
|
insert into partsupp_small select * from partsupp where ps_partkey <50;
|
||||||
|
analyze table partsupp_small persistent for all;
|
||||||
|
|
||||||
|
--echo # LooseScan
|
||||||
|
--echo # =========
|
||||||
|
|
||||||
|
let $c12 = l_suppkey in
|
||||||
|
(select ps_suppkey from partsupp_small
|
||||||
|
where ps_partkey in (1,2,3));
|
||||||
|
|
||||||
|
eval
|
||||||
|
explain
|
||||||
|
select count(*) from lineitem where $c12;
|
||||||
|
eval
|
||||||
|
explain format=json
|
||||||
|
select count(*) from lineitem where $c12;
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c12;
|
||||||
|
let $l_count =
|
||||||
|
query_get_value('select count(*) as a from lineitem where $c12;', a, 1);
|
||||||
|
let $l_old_sum =
|
||||||
|
query_get_value('select ROUND(sum(l_extendedprice),2) as a
|
||||||
|
from lineitem where $c12;', a, 1
|
||||||
|
);
|
||||||
|
eval select $l_count as count, $l_old_sum as old_sum;
|
||||||
|
|
||||||
|
eval
|
||||||
|
explain
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice+10 where $c12;
|
||||||
|
eval
|
||||||
|
explain format=json
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice+10 where $c12;
|
||||||
|
eval
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice+10 where $c12;
|
||||||
|
eval
|
||||||
|
select ROUND(sum(l_extendedprice),2), $l_count as count,
|
||||||
|
($l_old_sum+10*$l_count) as 'old_sum+10*count'
|
||||||
|
from lineitem where $c12;
|
||||||
|
|
||||||
|
eval
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice-10 where $c12;
|
||||||
|
eval
|
||||||
|
select ROUND(sum(l_extendedprice),2), $l_count as count,
|
||||||
|
$l_old_sum as old_sum from lineitem where $c12;
|
||||||
|
|
||||||
|
|
||||||
|
--echo # LooseScan PS
|
||||||
|
--echo # ============
|
||||||
|
|
||||||
|
eval
|
||||||
|
prepare stmt from "
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice+? where $c12;
|
||||||
|
";
|
||||||
|
|
||||||
|
let $l_count = query_get_value('select count(*) as a
|
||||||
|
from lineitem where $c12;', a, 1 );
|
||||||
|
let $l_old_sum = query_get_value('select ROUND(sum(l_extendedprice),2) as a
|
||||||
|
from lineitem where $c12;', a, 1 );
|
||||||
|
eval select $l_count as count, $l_old_sum as old_sum;
|
||||||
|
eval
|
||||||
|
set @a1=20;
|
||||||
|
execute stmt using @a1;
|
||||||
|
eval
|
||||||
|
select ROUND(sum(l_extendedprice),2), $l_count as count,
|
||||||
|
($l_old_sum+20*$l_count) as 'old_sum+20*count'
|
||||||
|
from lineitem where $c12;
|
||||||
|
set @a2=10;
|
||||||
|
execute stmt using @a2;
|
||||||
|
eval
|
||||||
|
select ROUND(sum(l_extendedprice),2), $l_count as count,
|
||||||
|
($l_old_sum+30*$l_count) as 'old_sum+30*count'
|
||||||
|
from lineitem where $c12;
|
||||||
|
execute stmt using -(@a1+@a2);
|
||||||
|
eval
|
||||||
|
select ROUND(sum(l_extendedprice),2), $l_count as count,
|
||||||
|
$l_old_sum as old_sum from lineitem where $c12;
|
||||||
|
|
||||||
|
deallocate prepare stmt;
|
||||||
|
|
||||||
|
--echo # LooseScan SP
|
||||||
|
--echo # ============
|
||||||
|
|
||||||
|
eval
|
||||||
|
create procedure p(d int)
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice+d where $c12;
|
||||||
|
|
||||||
|
let $l_count = query_get_value('select count(*) as a
|
||||||
|
from lineitem where $c12;', a, 1 );
|
||||||
|
let $l_old_sum = query_get_value('select ROUND(sum(l_extendedprice),2) as a
|
||||||
|
from lineitem where $c12;', a, 1 );
|
||||||
|
eval select $l_count as count, $l_old_sum as old_sum;
|
||||||
|
eval
|
||||||
|
call p(10);
|
||||||
|
eval
|
||||||
|
select ROUND(sum(l_extendedprice),2), $l_count as count,
|
||||||
|
($l_old_sum+10*$l_count) as 'old_sum+10*count'
|
||||||
|
from lineitem where $c12;
|
||||||
|
call p(20);
|
||||||
|
eval
|
||||||
|
select ROUND(sum(l_extendedprice),2), $l_count as count,
|
||||||
|
($l_old_sum+30*$l_count) as 'old_sum+30*count'
|
||||||
|
from lineitem where $c12;
|
||||||
|
call p(-(10+20));
|
||||||
|
eval
|
||||||
|
select ROUND(sum(l_extendedprice),2), $l_count as count,
|
||||||
|
$l_old_sum as old_sum from lineitem where $c12;
|
||||||
|
|
||||||
|
drop procedure p;
|
||||||
|
|
||||||
|
--echo # DuplicateWeedout
|
||||||
|
--echo # ================
|
||||||
|
|
||||||
|
set @tmp_optimizer_switch= @@optimizer_switch;
|
||||||
|
set optimizer_switch='materialization=off';
|
||||||
|
|
||||||
|
analyze table lineitem;
|
||||||
|
analyze table orders;
|
||||||
|
|
||||||
|
let $c13 = l_partkey in (
|
||||||
|
select ps_partkey
|
||||||
|
from partsupp_small join lineitem on ps_partkey=l_partkey
|
||||||
|
where ps_suppkey in (
|
||||||
|
select s_suppkey from supplier where s_suppkey < 2
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
eval
|
||||||
|
explain
|
||||||
|
select count(*) from lineitem where $c13;
|
||||||
|
eval
|
||||||
|
explain format=json
|
||||||
|
select count(*) from lineitem where $c13;
|
||||||
|
eval
|
||||||
|
select count(*) from lineitem where $c13;
|
||||||
|
|
||||||
|
let $l_count = query_get_value('select count(*) as a
|
||||||
|
from lineitem where $c13;', a, 1 );
|
||||||
|
let $l_old_sum = query_get_value('select ROUND(sum(l_extendedprice),2) as a
|
||||||
|
from lineitem where $c13;', a, 1 );
|
||||||
|
eval select $l_count as count, $l_old_sum as old_sum;
|
||||||
|
|
||||||
|
eval
|
||||||
|
explain
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice+10 where $c13;
|
||||||
|
eval
|
||||||
|
explain format=json
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice+10 where $c13;
|
||||||
|
eval
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice+10 where $c13;
|
||||||
|
eval
|
||||||
|
select ROUND(sum(l_extendedprice),2), $l_count as count,
|
||||||
|
($l_old_sum+10*$l_count) as 'old_sum+10*count'
|
||||||
|
from lineitem where $c13;
|
||||||
|
|
||||||
|
eval
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice-10 where $c13;
|
||||||
|
eval
|
||||||
|
select ROUND(sum(l_extendedprice),2), $l_count as count,
|
||||||
|
$l_old_sum as old_sum from lineitem where $c13;
|
||||||
|
|
||||||
|
|
||||||
|
--echo # DuplicateWeedout PS
|
||||||
|
--echo # ===================
|
||||||
|
|
||||||
|
eval
|
||||||
|
prepare stmt from "
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice+? where $c13;
|
||||||
|
";
|
||||||
|
|
||||||
|
let $l_count =
|
||||||
|
query_get_value('select count(*) as a
|
||||||
|
from lineitem where $c13;', a, 1 );
|
||||||
|
let $l_old_sum =
|
||||||
|
query_get_value('select ROUND(sum(l_extendedprice),2) as a
|
||||||
|
from lineitem where $c13;', a, 1);
|
||||||
|
eval select $l_count as count, $l_old_sum as old_sum;
|
||||||
|
eval
|
||||||
|
set @a1=20;
|
||||||
|
execute stmt using @a1;
|
||||||
|
eval
|
||||||
|
select ROUND(sum(l_extendedprice),2), $l_count as count,
|
||||||
|
($l_old_sum+20*$l_count) as 'old_sum+20*count'
|
||||||
|
from lineitem where $c13;
|
||||||
|
set @a2=10;
|
||||||
|
execute stmt using @a2;
|
||||||
|
eval
|
||||||
|
select ROUND(sum(l_extendedprice),2), $l_count as count,
|
||||||
|
($l_old_sum+30*$l_count) as 'old_sum+30*count'
|
||||||
|
from lineitem where $c13;
|
||||||
|
execute stmt using -(@a1+@a2);
|
||||||
|
eval
|
||||||
|
select ROUND(sum(l_extendedprice),2), $l_count as count,
|
||||||
|
$l_old_sum as old_sum from lineitem where $c13;
|
||||||
|
|
||||||
|
deallocate prepare stmt;
|
||||||
|
|
||||||
|
--echo # DuplicateWeedout SP
|
||||||
|
--echo # ===================
|
||||||
|
|
||||||
|
eval
|
||||||
|
create procedure p(d int)
|
||||||
|
update lineitem set l_extendedprice=l_extendedprice+d where $c13;
|
||||||
|
|
||||||
|
let $l_count = query_get_value('select count(*) as a
|
||||||
|
from lineitem where $c13;', a, 1 );
|
||||||
|
let $l_old_sum = query_get_value('select ROUND(sum(l_extendedprice),2) as a
|
||||||
|
from lineitem where $c13;', a, 1 );
|
||||||
|
eval select $l_count as count, $l_old_sum as old_sum;
|
||||||
|
eval
|
||||||
|
call p(10);
|
||||||
|
|
||||||
|
eval
|
||||||
|
select ROUND(sum(l_extendedprice),2), $l_count as count,
|
||||||
|
($l_old_sum+10*$l_count) as 'old_sum+10*count'
|
||||||
|
from lineitem where $c13;
|
||||||
|
call p(20);
|
||||||
|
eval
|
||||||
|
select ROUND(sum(l_extendedprice),2), $l_count as count,
|
||||||
|
($l_old_sum+30*$l_count) as 'old_sum+30*count'
|
||||||
|
from lineitem where $c13;
|
||||||
|
call p(-(10+20));
|
||||||
|
eval
|
||||||
|
select ROUND(sum(l_extendedprice),2), $l_count as count,
|
||||||
|
$l_old_sum as old_sum from lineitem where $c13;
|
||||||
|
|
||||||
|
drop procedure p;
|
||||||
|
set @@optimizer_switch=@tmp_optimizer_switch;
|
||||||
|
|
||||||
|
drop table partsupp_small;
|
||||||
|
|
||||||
DROP DATABASE dbt3_s001;
|
DROP DATABASE dbt3_s001;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -2,221 +2,55 @@
|
|||||||
--source include/have_innodb.inc
|
--source include/have_innodb.inc
|
||||||
--source include/no_valgrind_without_big.inc
|
--source include/no_valgrind_without_big.inc
|
||||||
|
|
||||||
create table t1 (old_c1 integer, old_c2 integer,c1 integer, c2 integer, c3 integer) engine=InnoDB STATS_PERSISTENT=0;
|
set @save_default_engine=@@default_storage_engine;
|
||||||
create view v1 as select * from t1 where c2=2;
|
|
||||||
delimiter /;
|
|
||||||
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;
|
|
||||||
/
|
|
||||||
delimiter ;/
|
|
||||||
|
|
||||||
insert into t1(c1,c2,c3) values (1,1,1);
|
--echo #######################################
|
||||||
insert into t1(c1,c2,c3) values (1,2,2);
|
--echo # #
|
||||||
insert into t1(c1,c2,c3) values (1,3,3);
|
--echo # Engine InnoDB #
|
||||||
insert into t1(c1,c2,c3) values (2,1,4);
|
--echo # #
|
||||||
insert into t1(c1,c2,c3) values (2,2,5);
|
--echo #######################################
|
||||||
insert into t1(c1,c2,c3) values (2,3,6);
|
set global innodb_stats_persistent=1;
|
||||||
insert into t1(c1,c2,c3) values (2,4,7);
|
set default_storage_engine=InnoDB;
|
||||||
insert into t1(c1,c2,c3) values (2,5,8);
|
--source include/update_use_source.inc
|
||||||
|
--source include/update_use_source_ext.inc
|
||||||
|
|
||||||
commit;
|
--echo #######################################
|
||||||
select * from t1;
|
--echo # #
|
||||||
|
--echo # Engine Aria #
|
||||||
|
--echo # #
|
||||||
|
--echo #######################################
|
||||||
|
set default_storage_engine=Aria;
|
||||||
|
--source include/update_use_source.inc
|
||||||
|
--source include/update_use_source_ext.inc
|
||||||
|
|
||||||
--echo Test without any index
|
--echo #######################################
|
||||||
|
--echo # #
|
||||||
|
--echo # Engine MyISAM #
|
||||||
|
--echo # #
|
||||||
|
--echo #######################################
|
||||||
|
set default_storage_engine=MyISAM;
|
||||||
|
--source include/update_use_source.inc
|
||||||
|
--source include/update_use_source_ext.inc
|
||||||
|
|
||||||
|
--echo #######################################
|
||||||
|
--echo # #
|
||||||
|
--echo # Engine MEMORY #
|
||||||
|
--echo # #
|
||||||
|
--echo #######################################
|
||||||
|
set default_storage_engine=MEMORY;
|
||||||
--source include/update_use_source.inc
|
--source include/update_use_source.inc
|
||||||
|
|
||||||
--echo Test with an index on updated columns
|
set @@default_storage_engine=@save_default_engine;
|
||||||
create index t1_c2 on t1 (c2,c1);
|
|
||||||
--source include/update_use_source.inc
|
|
||||||
|
|
||||||
--echo Test with an index on updated columns
|
|
||||||
create index t1_c3 on t1 (c3);
|
|
||||||
--source include/update_use_source.inc
|
|
||||||
|
|
||||||
--echo Test with a primary key on updated columns
|
|
||||||
drop index t1_c3 on t1;
|
|
||||||
alter table t1 add primary key (c3);
|
|
||||||
--source include/update_use_source.inc
|
|
||||||
|
|
||||||
--echo # Update with error "Subquery returns more than 1 row"
|
|
||||||
--error ER_SUBQUERY_NO_1_ROW
|
|
||||||
update t1 set c2=(select c2 from t1);
|
|
||||||
|
|
||||||
--echo # Update with error "Subquery returns more than 1 row" and order by
|
|
||||||
--error ER_SUBQUERY_NO_1_ROW
|
|
||||||
update t1 set c2=(select c2 from t1) order by c3;
|
|
||||||
|
|
||||||
-- echo Duplicate value on update a primary key
|
|
||||||
start transaction;
|
|
||||||
--error ER_DUP_ENTRY
|
|
||||||
update t1 set c3=0 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
|
|
||||||
rollback;
|
|
||||||
|
|
||||||
-- echo Duplicate value on update a primary key with ignore
|
|
||||||
start transaction;
|
|
||||||
--enable_info ONCE
|
|
||||||
update ignore t1 set c3=0 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
|
|
||||||
rollback;
|
|
||||||
|
|
||||||
-- echo Duplicate value on update a primary key and limit
|
|
||||||
start transaction;
|
|
||||||
--error ER_DUP_ENTRY
|
|
||||||
update t1 set c3=0 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3 limit 2;
|
|
||||||
rollback;
|
|
||||||
|
|
||||||
-- echo Duplicate value on update a primary key with ignore and limit
|
|
||||||
start transaction;
|
|
||||||
--enable_info ONCE
|
|
||||||
update ignore t1 set c3=0 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3 limit 2;
|
|
||||||
rollback;
|
|
||||||
|
|
||||||
--echo # Update no rows found
|
|
||||||
--enable_info ONCE
|
|
||||||
update t1
|
|
||||||
set c1=10
|
|
||||||
where c1 <2
|
|
||||||
and exists (select 'X'
|
|
||||||
from t1 a
|
|
||||||
where a.c1 = t1.c1 + 10);
|
|
||||||
|
|
||||||
--echo # Update no rows changed
|
|
||||||
drop trigger trg_t1;
|
|
||||||
start transaction;
|
|
||||||
--enable_info ONCE
|
|
||||||
update t1
|
|
||||||
set c1=c1
|
|
||||||
where c1 <2
|
|
||||||
and exists (select 'X'
|
|
||||||
from t1 a
|
|
||||||
where a.c1 = t1.c1);
|
|
||||||
rollback;
|
|
||||||
|
|
||||||
--echo #
|
|
||||||
--echo # Check call of after trigger
|
|
||||||
--echo #
|
|
||||||
|
|
||||||
delimiter /;
|
|
||||||
create or replace trigger trg_t2 after update on t1 for each row
|
|
||||||
begin
|
|
||||||
declare msg varchar(100);
|
|
||||||
if (new.c3 = 5) then
|
|
||||||
set msg=concat('in after update trigger on ',new.c3);
|
|
||||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
|
|
||||||
end if;
|
|
||||||
end;
|
|
||||||
/
|
|
||||||
delimiter ;/
|
|
||||||
--error 1644
|
|
||||||
update t1 set c1=2 where c3 in (select distinct a.c3 from t1 a where a.c1=t1.c1);
|
|
||||||
|
|
||||||
--echo #
|
|
||||||
--echo # Check update with order by and after trigger
|
|
||||||
--echo #
|
|
||||||
|
|
||||||
--error 1644
|
|
||||||
update t1 set c1=2 where c3 in (select distinct a.c3 from t1 a where a.c1=t1.c1) order by t1.c2;
|
|
||||||
|
|
||||||
drop view v1;
|
|
||||||
--echo #
|
|
||||||
--echo # Check update on view with check option
|
|
||||||
--echo #
|
|
||||||
|
|
||||||
create view v1 as select * from t1 where c2=2 with check option;
|
|
||||||
|
|
||||||
start transaction;
|
|
||||||
-- error 1369
|
|
||||||
update v1 set c2=3 where c1=1;
|
|
||||||
rollback;
|
|
||||||
|
|
||||||
start transaction;
|
|
||||||
-- error 1369
|
|
||||||
update v1 set c2=(select max(c3) from v1) where c1=1;
|
|
||||||
rollback;
|
|
||||||
|
|
||||||
start transaction;
|
|
||||||
update v1 set c2=(select min(va.c3) from v1 va), c1=0 where c1=1;
|
|
||||||
rollback;
|
|
||||||
|
|
||||||
drop view v1;
|
|
||||||
drop table t1;
|
|
||||||
|
|
||||||
--echo #
|
|
||||||
--echo # Test with a temporary table
|
|
||||||
--echo #
|
|
||||||
|
|
||||||
create temporary table t1 (c1 integer, c2 integer, c3 integer) engine=InnoDb;
|
|
||||||
insert into t1(c1,c2,c3) values (1,1,1);
|
|
||||||
insert into t1(c1,c2,c3) values (1,2,2);
|
|
||||||
insert into t1(c1,c2,c3) values (1,3,3);
|
|
||||||
insert into t1(c1,c2,c3) values (2,1,4);
|
|
||||||
insert into t1(c1,c2,c3) values (2,2,5);
|
|
||||||
insert into t1(c1,c2,c3) values (2,3,6);
|
|
||||||
insert into t1(c1,c2,c3) values (2,4,7);
|
|
||||||
insert into t1(c1,c2,c3) values (2,5,8);
|
|
||||||
|
|
||||||
start transaction;
|
|
||||||
--enable_info ONCE
|
|
||||||
update t1
|
|
||||||
set c1=(select a.c2
|
|
||||||
from t1 a
|
|
||||||
where a.c3 = t1.c3) limit 3;
|
|
||||||
select * from t1 ;
|
|
||||||
rollback;
|
|
||||||
drop table t1;
|
|
||||||
|
|
||||||
--echo #
|
|
||||||
--echo # Test on dynamic columns (blob)
|
|
||||||
--echo #
|
|
||||||
|
|
||||||
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;
|
|
||||||
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;
|
|
||||||
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;
|
|
||||||
|
|
||||||
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;
|
|
||||||
drop table assets ;
|
|
||||||
|
|
||||||
--echo #
|
|
||||||
--echo # Test on fulltext columns
|
|
||||||
--echo #
|
|
||||||
CREATE TABLE ft2(copy TEXT,FULLTEXT(copy)) ENGINE=MyISAM;
|
|
||||||
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');
|
|
||||||
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');
|
|
||||||
drop table ft2;
|
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # Test with MyISAM
|
--echo # Test with MyISAM
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
create table t1 (old_c1 integer, old_c2 integer,c1 integer, c2 integer, c3 integer) engine=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 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 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 2,seq,seq%10 from seq_1_to_300;
|
||||||
@ -232,12 +66,14 @@ drop table t1;
|
|||||||
|
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # Test error on multi_update conversion on view with order by or limit
|
--echo # Test error on multi_update conversion on view
|
||||||
|
--echo # with order by or limit
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
create table t1 (c1 integer) engine=InnoDb;
|
create table t1 (c1 integer) engine=InnoDb;
|
||||||
create table t2 (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;
|
create view v1 as select t1.c1 as "t1c1" ,t2.c1 as "t2c1"
|
||||||
|
from t1,t2 where t1.c1=t2.c1;
|
||||||
# 'order by 1' should be considered as in 'select * from v1 order 1'
|
# 'order by 1' should be considered as in 'select * from v1 order 1'
|
||||||
update v1 set t1c1=2 order by 1;
|
update v1 set t1c1=2 order by 1;
|
||||||
update v1 set t1c1=2 limit 1;
|
update v1 set t1c1=2 limit 1;
|
||||||
|
@ -1146,3 +1146,104 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresp
|
|||||||
#
|
#
|
||||||
# End of 10.9 tests
|
# End of 10.9 tests
|
||||||
#
|
#
|
||||||
|
#
|
||||||
|
# MDEV-29390: Improve coverage for UPDATE and DELETE statements in MTR test suites
|
||||||
|
#
|
||||||
|
# Multi-update with JSON_TABLE
|
||||||
|
create table t1 ( name varchar(10),
|
||||||
|
color varchar(10),
|
||||||
|
price decimal(8,2),
|
||||||
|
instock BOOLEAN);
|
||||||
|
insert into t1 values ("Laptop", "black", 20000, 1);
|
||||||
|
insert into t1 values ("Jacket", "brown", 5000, 1);
|
||||||
|
insert into t1 values ("Jeans", "blue", 5000, 1);
|
||||||
|
select * from t1;
|
||||||
|
name color price instock
|
||||||
|
Laptop black 20000.00 1
|
||||||
|
Jacket brown 5000.00 1
|
||||||
|
Jeans blue 5000.00 1
|
||||||
|
set @json='
|
||||||
|
[
|
||||||
|
{"name":"Laptop", "color":"black", "price":"1000", "ordered":"3"},
|
||||||
|
{"name":"Jeans", "color":"blue", "ordered":"0"},
|
||||||
|
{"name":"Phone", "color":"red", "ordered":"0"}
|
||||||
|
]';
|
||||||
|
select * from json_table(@json, '$[*]'
|
||||||
|
columns(
|
||||||
|
name varchar(10) path '$.name',
|
||||||
|
color varchar(10) path '$.color',
|
||||||
|
price decimal(8,2) path '$.price',
|
||||||
|
ordered boolean path '$.ordered' )
|
||||||
|
) as jt;
|
||||||
|
name color price ordered
|
||||||
|
Laptop black 1000.00 3
|
||||||
|
Jeans blue NULL 0
|
||||||
|
Phone red NULL 0
|
||||||
|
explain update t1, JSON_TABLE(@json,'$[*]'
|
||||||
|
COLUMNS (
|
||||||
|
name varchar(10) path '$.name',
|
||||||
|
color varchar(10) path '$.color',
|
||||||
|
price decimal(8,2) path '$.price',
|
||||||
|
ordered boolean path '$.ordered'
|
||||||
|
)) AS jt1
|
||||||
|
SET t1.instock=0 where t1.name=jt1.name and jt1.ordered=3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 3
|
||||||
|
1 SIMPLE jt1 ALL NULL NULL NULL NULL 40 Table function: json_table; Using where
|
||||||
|
update t1, JSON_TABLE(@json,'$[*]'
|
||||||
|
COLUMNS (
|
||||||
|
name varchar(10) path '$.name',
|
||||||
|
color varchar(10) path '$.color',
|
||||||
|
price decimal(8,2) path '$.price',
|
||||||
|
ordered boolean path '$.ordered'
|
||||||
|
)) AS jt1
|
||||||
|
SET t1.instock=0 where t1.name=jt1.name and jt1.ordered=2;
|
||||||
|
select * from t1;
|
||||||
|
name color price instock
|
||||||
|
Laptop black 20000.00 1
|
||||||
|
Jacket brown 5000.00 1
|
||||||
|
Jeans blue 5000.00 1
|
||||||
|
explain update t1
|
||||||
|
SET t1.instock=2 where t1.name in (
|
||||||
|
select jt1.name from json_table(@json, '$[*]'
|
||||||
|
columns(
|
||||||
|
name varchar(10) path '$.name',
|
||||||
|
color varchar(10) path '$.color',
|
||||||
|
price decimal(8,2) path '$.price',
|
||||||
|
ordered boolean path '$.ordered' )
|
||||||
|
) as jt1);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 3
|
||||||
|
1 PRIMARY jt1 ALL NULL NULL NULL NULL 40 Table function: json_table; Using where; FirstMatch(t1)
|
||||||
|
update t1
|
||||||
|
SET t1.instock=2 where t1.name in (
|
||||||
|
select jt1.name from json_table(@json, '$[*]'
|
||||||
|
columns(
|
||||||
|
name varchar(10) path '$.name',
|
||||||
|
color varchar(10) path '$.color',
|
||||||
|
price decimal(8,2) path '$.price',
|
||||||
|
ordered boolean path '$.ordered' )
|
||||||
|
) as jt1);
|
||||||
|
select * from t1;
|
||||||
|
name color price instock
|
||||||
|
Laptop black 20000.00 2
|
||||||
|
Jacket brown 5000.00 1
|
||||||
|
Jeans blue 5000.00 2
|
||||||
|
update t1, JSON_TABLE(@json,'$[*]'
|
||||||
|
COLUMNS (
|
||||||
|
name varchar(10) path '$.name',
|
||||||
|
color varchar(10) path '$.color',
|
||||||
|
price decimal(8,2) path '$.price',
|
||||||
|
ordered boolean path '$.ordered'
|
||||||
|
)) AS jt1
|
||||||
|
SET t1.instock=0, jt1.ordered=1 where t1.name=jt1.name;
|
||||||
|
ERROR HY000: The target table jt1 of the UPDATE is not updatable
|
||||||
|
select * from t1;
|
||||||
|
name color price instock
|
||||||
|
Laptop black 20000.00 2
|
||||||
|
Jacket brown 5000.00 1
|
||||||
|
Jeans blue 5000.00 2
|
||||||
|
drop table t1;
|
||||||
|
#
|
||||||
|
# End of 11.0 tests
|
||||||
|
#
|
||||||
|
@ -997,3 +997,97 @@ COLUMNS
|
|||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.9 tests
|
--echo # End of 10.9 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-29390: Improve coverage for UPDATE and DELETE statements in MTR test suites
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo # Multi-update with JSON_TABLE
|
||||||
|
|
||||||
|
create table t1 ( name varchar(10),
|
||||||
|
color varchar(10),
|
||||||
|
price decimal(8,2),
|
||||||
|
instock BOOLEAN);
|
||||||
|
|
||||||
|
insert into t1 values ("Laptop", "black", 20000, 1);
|
||||||
|
insert into t1 values ("Jacket", "brown", 5000, 1);
|
||||||
|
insert into t1 values ("Jeans", "blue", 5000, 1);
|
||||||
|
|
||||||
|
select * from t1;
|
||||||
|
|
||||||
|
set @json='
|
||||||
|
[
|
||||||
|
{"name":"Laptop", "color":"black", "price":"1000", "ordered":"3"},
|
||||||
|
{"name":"Jeans", "color":"blue", "ordered":"0"},
|
||||||
|
{"name":"Phone", "color":"red", "ordered":"0"}
|
||||||
|
]';
|
||||||
|
|
||||||
|
select * from json_table(@json, '$[*]'
|
||||||
|
columns(
|
||||||
|
name varchar(10) path '$.name',
|
||||||
|
color varchar(10) path '$.color',
|
||||||
|
price decimal(8,2) path '$.price',
|
||||||
|
ordered boolean path '$.ordered' )
|
||||||
|
) as jt;
|
||||||
|
|
||||||
|
explain update t1, JSON_TABLE(@json,'$[*]'
|
||||||
|
COLUMNS (
|
||||||
|
name varchar(10) path '$.name',
|
||||||
|
color varchar(10) path '$.color',
|
||||||
|
price decimal(8,2) path '$.price',
|
||||||
|
ordered boolean path '$.ordered'
|
||||||
|
)) AS jt1
|
||||||
|
SET t1.instock=0 where t1.name=jt1.name and jt1.ordered=3;
|
||||||
|
|
||||||
|
update t1, JSON_TABLE(@json,'$[*]'
|
||||||
|
COLUMNS (
|
||||||
|
name varchar(10) path '$.name',
|
||||||
|
color varchar(10) path '$.color',
|
||||||
|
price decimal(8,2) path '$.price',
|
||||||
|
ordered boolean path '$.ordered'
|
||||||
|
)) AS jt1
|
||||||
|
SET t1.instock=0 where t1.name=jt1.name and jt1.ordered=2;
|
||||||
|
|
||||||
|
select * from t1;
|
||||||
|
|
||||||
|
explain update t1
|
||||||
|
SET t1.instock=2 where t1.name in (
|
||||||
|
select jt1.name from json_table(@json, '$[*]'
|
||||||
|
columns(
|
||||||
|
name varchar(10) path '$.name',
|
||||||
|
color varchar(10) path '$.color',
|
||||||
|
price decimal(8,2) path '$.price',
|
||||||
|
ordered boolean path '$.ordered' )
|
||||||
|
) as jt1);
|
||||||
|
|
||||||
|
|
||||||
|
update t1
|
||||||
|
SET t1.instock=2 where t1.name in (
|
||||||
|
select jt1.name from json_table(@json, '$[*]'
|
||||||
|
columns(
|
||||||
|
name varchar(10) path '$.name',
|
||||||
|
color varchar(10) path '$.color',
|
||||||
|
price decimal(8,2) path '$.price',
|
||||||
|
ordered boolean path '$.ordered' )
|
||||||
|
) as jt1);
|
||||||
|
|
||||||
|
select * from t1;
|
||||||
|
|
||||||
|
|
||||||
|
-- error ER_NON_UPDATABLE_TABLE
|
||||||
|
update t1, JSON_TABLE(@json,'$[*]'
|
||||||
|
COLUMNS (
|
||||||
|
name varchar(10) path '$.name',
|
||||||
|
color varchar(10) path '$.color',
|
||||||
|
price decimal(8,2) path '$.price',
|
||||||
|
ordered boolean path '$.ordered'
|
||||||
|
)) AS jt1
|
||||||
|
SET t1.instock=0, jt1.ordered=1 where t1.name=jt1.name;
|
||||||
|
|
||||||
|
select * from t1;
|
||||||
|
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 11.0 tests
|
||||||
|
--echo #
|
||||||
|
@ -1627,3 +1627,159 @@ serialno name sex title manager department secretary salary
|
|||||||
DROP PROCEDURE test.tst_up;
|
DROP PROCEDURE test.tst_up;
|
||||||
DROP TABLE employee;
|
DROP TABLE employee;
|
||||||
SET sql_mode = DEFAULT;
|
SET sql_mode = DEFAULT;
|
||||||
|
#
|
||||||
|
# End of 10.10 tests
|
||||||
|
#
|
||||||
|
SET sql_mode = 'NO_ENGINE_SUBSTITUTION';
|
||||||
|
CREATE TABLE t1
|
||||||
|
(
|
||||||
|
name char(12) not null,
|
||||||
|
city char(11) not null,
|
||||||
|
birth date not null date_format='DD/MM/YYYY',
|
||||||
|
hired date not null date_format='DD/MM/YYYY' flag=36
|
||||||
|
) ENGINE=CONNECT TABLE_TYPE=FIX FILE_NAME='boys.txt' ENDING=1;
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
_id INT(2) NOT NULL,
|
||||||
|
name_first CHAR(9) NOT NULL JPATH='$.name.first',
|
||||||
|
name_aka CHAR(4) DEFAULT NULL JPATH='$.name.aka',
|
||||||
|
name_last CHAR(10) NOT NULL JPATH='$.name.last',
|
||||||
|
title CHAR(12) DEFAULT NULL,
|
||||||
|
birth CHAR(20) DEFAULT NULL,
|
||||||
|
death CHAR(20) DEFAULT NULL,
|
||||||
|
contribs CHAR(50) NOT NULL JPATH='$.contribs',
|
||||||
|
awards_award CHAR(42) DEFAULT NULL JPATH='$.awards.award',
|
||||||
|
awards_year CHAR(4) DEFAULT NULL JPATH='$.awards.year',
|
||||||
|
awards_by CHAR(38) DEFAULT NULL JPATH='$.awards.by'
|
||||||
|
) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='bios.json';
|
||||||
|
# Multi-update
|
||||||
|
select t1.name, t1.city from t1;
|
||||||
|
name city
|
||||||
|
John Boston
|
||||||
|
Henry Boston
|
||||||
|
George San Jose
|
||||||
|
Sam Chicago
|
||||||
|
James Dallas
|
||||||
|
Bill Boston
|
||||||
|
select t2._id, t2.name_first, t2.name_aka, t2.name_last from t2;
|
||||||
|
_id name_first name_aka name_last
|
||||||
|
1 John NULL Backus
|
||||||
|
2 John NULL McCarthy
|
||||||
|
3 Grace NULL Hopper
|
||||||
|
4 Kristen NULL Nygaard
|
||||||
|
5 Ole-Johan NULL Dahl
|
||||||
|
6 Guido NULL van Rossum
|
||||||
|
7 Dennis NULL Ritchie
|
||||||
|
8 Yukihiro Matz Matsumoto
|
||||||
|
9 James NULL Gosling
|
||||||
|
10 Martin NULL Odersky
|
||||||
|
select t1.name, t2.name_last, t2.name_aka, t1.city from t1, t2 where t1.name=t2.name_first and t1.birth
|
||||||
|
BETWEEN '1992-01-01' and '1995-01-01';
|
||||||
|
name name_last name_aka city
|
||||||
|
James Gosling NULL Dallas
|
||||||
|
explain update t1, t2
|
||||||
|
set t1.city='Washington', t2.name_aka='von' where t1.name=t2.name_first and t1.birth
|
||||||
|
BETWEEN '1992-01-01' and '1995-01-01';
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 6 Using where
|
||||||
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 10 Using where
|
||||||
|
update t1, t2
|
||||||
|
set t1.city='Washington', t2.name_aka='von' where t1.name=t2.name_first and t1.birth
|
||||||
|
BETWEEN '1992-01-01' and '1995-01-01';
|
||||||
|
select t1.name, t2.name_last, t2.name_aka, t1.city from t1, t2 where t1.name=t2.name_first and t1.birth
|
||||||
|
BETWEEN '1992-01-01' and '1995-01-01';
|
||||||
|
name name_last name_aka city
|
||||||
|
James Gosling von Washington
|
||||||
|
# Conversion to multi-update
|
||||||
|
select t1.name, t1.city from t1;
|
||||||
|
name city
|
||||||
|
John Boston
|
||||||
|
Henry Boston
|
||||||
|
George San Jose
|
||||||
|
Sam Chicago
|
||||||
|
James Washington
|
||||||
|
Bill Boston
|
||||||
|
explain update t1
|
||||||
|
set t1.city='New York' where t1.name in (select t2.name_first from t2);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 6
|
||||||
|
1 PRIMARY t2 ALL NULL NULL NULL NULL 10 Using where; FirstMatch(t1)
|
||||||
|
update t1
|
||||||
|
set t1.city='New York' where t1.name in (select t2.name_first from t2);
|
||||||
|
select t1.name, t1.city from t1;
|
||||||
|
name city
|
||||||
|
John New York
|
||||||
|
Henry Boston
|
||||||
|
George San Jose
|
||||||
|
Sam Chicago
|
||||||
|
James New York
|
||||||
|
Bill Boston
|
||||||
|
select t1.name, t1.city from t1 where t1.name in (select a.name from t1 as a where a.birth
|
||||||
|
BETWEEN '1981-01-01' and '1982-01-01');
|
||||||
|
name city
|
||||||
|
George San Jose
|
||||||
|
explain update t1 set t1.city='Los Angeles' where t1.name in (select a.name from t1 as a where a.birth
|
||||||
|
BETWEEN '1981-01-01' and '1982-01-01');
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 6
|
||||||
|
1 PRIMARY a ALL NULL NULL NULL NULL 6 Using where; FirstMatch(t1)
|
||||||
|
update t1 set t1.city='Los Angeles' where t1.name in (select a.name from t1 as a where a.birth
|
||||||
|
BETWEEN '1981-01-01' and '1982-01-01');
|
||||||
|
select t1.name, t1.city from t1 where t1.name in (select a.name from t1 as a where a.birth
|
||||||
|
BETWEEN '1981-01-01' and '1982-01-01');
|
||||||
|
name city
|
||||||
|
George Los Angeles
|
||||||
|
# Multi-delete
|
||||||
|
explain delete t1.*, t2.* from t1, t2 where t1.name=t2.name_first and t1.birth
|
||||||
|
BETWEEN '1992-01-01' and '1995-01-01';
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 6 Using where
|
||||||
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 10 Using where
|
||||||
|
delete t1.*, t2.* from t1, t2 where t1.name=t2.name_first and t1.birth
|
||||||
|
BETWEEN '1992-01-01' and '1995-01-01';
|
||||||
|
select t1.name, t1.city from t1;
|
||||||
|
name city
|
||||||
|
John New York
|
||||||
|
Henry Boston
|
||||||
|
George Los Angeles
|
||||||
|
Sam Chicago
|
||||||
|
Bill Boston
|
||||||
|
select t2._id, t2.name_first, t2.name_aka, t2.name_last from t2;
|
||||||
|
_id name_first name_aka name_last
|
||||||
|
1 John NULL Backus
|
||||||
|
2 John NULL McCarthy
|
||||||
|
3 Grace NULL Hopper
|
||||||
|
4 Kristen NULL Nygaard
|
||||||
|
5 Ole-Johan NULL Dahl
|
||||||
|
6 Guido NULL van Rossum
|
||||||
|
7 Dennis NULL Ritchie
|
||||||
|
8 Yukihiro Matz Matsumoto
|
||||||
|
10 Martin NULL Odersky
|
||||||
|
# Conversion to multi-delete
|
||||||
|
explain delete from t1 where t1.name in (select t2.name_first from t2);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 5
|
||||||
|
1 PRIMARY t2 ALL NULL NULL NULL NULL 9 Using where; FirstMatch(t1)
|
||||||
|
delete from t1 where t1.name in (select t2.name_first from t2);
|
||||||
|
select t1.name, t1.city from t1;
|
||||||
|
name city
|
||||||
|
Henry Boston
|
||||||
|
George Los Angeles
|
||||||
|
Sam Chicago
|
||||||
|
Bill Boston
|
||||||
|
explain delete from t1 where t1.name in (select a.name from t1 as a where a.birth
|
||||||
|
BETWEEN '1981-01-01' and '1982-01-01');
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 4
|
||||||
|
1 PRIMARY a ALL NULL NULL NULL NULL 4 Using where; FirstMatch(t1)
|
||||||
|
delete from t1 where t1.name in (select a.name from t1 as a where a.birth
|
||||||
|
BETWEEN '1981-01-01' and '1982-01-01');
|
||||||
|
select t1.name, t1.city from t1;
|
||||||
|
name city
|
||||||
|
Henry Boston
|
||||||
|
Sam Chicago
|
||||||
|
Bill Boston
|
||||||
|
drop tables t1, t2;
|
||||||
|
SET sql_mode = DEFAULT;
|
||||||
|
#
|
||||||
|
# End of 11.0 tests
|
||||||
|
#
|
||||||
|
@ -155,3 +155,99 @@ DROP TABLE employee;
|
|||||||
SET sql_mode = DEFAULT;
|
SET sql_mode = DEFAULT;
|
||||||
|
|
||||||
--remove_file $MYSQLD_DATADIR/test/employee.dat
|
--remove_file $MYSQLD_DATADIR/test/employee.dat
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.10 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--copy_file $MTR_SUITE_DIR/std_data/boys.txt $MYSQLD_DATADIR/test/boys.txt
|
||||||
|
--copy_file $MTR_SUITE_DIR/std_data/bios.json $MYSQLD_DATADIR/test/bios.json
|
||||||
|
|
||||||
|
SET sql_mode = 'NO_ENGINE_SUBSTITUTION';
|
||||||
|
|
||||||
|
CREATE TABLE t1
|
||||||
|
(
|
||||||
|
name char(12) not null,
|
||||||
|
city char(11) not null,
|
||||||
|
birth date not null date_format='DD/MM/YYYY',
|
||||||
|
hired date not null date_format='DD/MM/YYYY' flag=36
|
||||||
|
) ENGINE=CONNECT TABLE_TYPE=FIX FILE_NAME='boys.txt' ENDING=1;
|
||||||
|
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
_id INT(2) NOT NULL,
|
||||||
|
name_first CHAR(9) NOT NULL JPATH='$.name.first',
|
||||||
|
name_aka CHAR(4) DEFAULT NULL JPATH='$.name.aka',
|
||||||
|
name_last CHAR(10) NOT NULL JPATH='$.name.last',
|
||||||
|
title CHAR(12) DEFAULT NULL,
|
||||||
|
birth CHAR(20) DEFAULT NULL,
|
||||||
|
death CHAR(20) DEFAULT NULL,
|
||||||
|
contribs CHAR(50) NOT NULL JPATH='$.contribs',
|
||||||
|
awards_award CHAR(42) DEFAULT NULL JPATH='$.awards.award',
|
||||||
|
awards_year CHAR(4) DEFAULT NULL JPATH='$.awards.year',
|
||||||
|
awards_by CHAR(38) DEFAULT NULL JPATH='$.awards.by'
|
||||||
|
) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='bios.json';
|
||||||
|
|
||||||
|
--echo # Multi-update
|
||||||
|
|
||||||
|
select t1.name, t1.city from t1;
|
||||||
|
select t2._id, t2.name_first, t2.name_aka, t2.name_last from t2;
|
||||||
|
|
||||||
|
let $c1 = where t1.name=t2.name_first and t1.birth
|
||||||
|
BETWEEN '1992-01-01' and '1995-01-01';
|
||||||
|
|
||||||
|
eval select t1.name, t2.name_last, t2.name_aka, t1.city from t1, t2 $c1;
|
||||||
|
eval explain update t1, t2
|
||||||
|
set t1.city='Washington', t2.name_aka='von' $c1;
|
||||||
|
eval update t1, t2
|
||||||
|
set t1.city='Washington', t2.name_aka='von' $c1;
|
||||||
|
eval select t1.name, t2.name_last, t2.name_aka, t1.city from t1, t2 $c1;
|
||||||
|
|
||||||
|
--echo # Conversion to multi-update
|
||||||
|
|
||||||
|
let $c2 = where t1.name in (select t2.name_first from t2);
|
||||||
|
|
||||||
|
select t1.name, t1.city from t1;
|
||||||
|
eval explain update t1
|
||||||
|
set t1.city='New York' $c2;
|
||||||
|
eval update t1
|
||||||
|
set t1.city='New York' $c2;
|
||||||
|
select t1.name, t1.city from t1;
|
||||||
|
|
||||||
|
let $c3 = where t1.name in (select a.name from t1 as a where a.birth
|
||||||
|
BETWEEN '1981-01-01' and '1982-01-01');
|
||||||
|
|
||||||
|
eval select t1.name, t1.city from t1 $c3;
|
||||||
|
eval explain update t1 set t1.city='Los Angeles' $c3;
|
||||||
|
eval update t1 set t1.city='Los Angeles' $c3;
|
||||||
|
eval select t1.name, t1.city from t1 $c3;
|
||||||
|
|
||||||
|
--echo # Multi-delete
|
||||||
|
|
||||||
|
eval explain delete t1.*, t2.* from t1, t2 $c1;
|
||||||
|
eval delete t1.*, t2.* from t1, t2 $c1;
|
||||||
|
|
||||||
|
select t1.name, t1.city from t1;
|
||||||
|
select t2._id, t2.name_first, t2.name_aka, t2.name_last from t2;
|
||||||
|
|
||||||
|
--echo # Conversion to multi-delete
|
||||||
|
|
||||||
|
eval explain delete from t1 $c2;
|
||||||
|
eval delete from t1 $c2;
|
||||||
|
|
||||||
|
select t1.name, t1.city from t1;
|
||||||
|
|
||||||
|
eval explain delete from t1 $c3;
|
||||||
|
eval delete from t1 $c3;
|
||||||
|
|
||||||
|
select t1.name, t1.city from t1;
|
||||||
|
|
||||||
|
drop tables t1, t2;
|
||||||
|
|
||||||
|
SET sql_mode = DEFAULT;
|
||||||
|
|
||||||
|
--remove_file $MYSQLD_DATADIR/test/boys.txt
|
||||||
|
--remove_file $MYSQLD_DATADIR/test/bios.json
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 11.0 tests
|
||||||
|
--echo #
|
||||||
|
Reference in New Issue
Block a user