From d2cbf35f72fe69bcfa2a90dd0e8b3ebfc366d7c2 Mon Sep 17 00:00:00 2001 From: adofsauron Date: Thu, 1 Dec 2022 22:37:05 +0800 Subject: [PATCH] fix(tianmu): fix query exists with primary key (#971 #944) --- mysql-test/suite/tianmu/r/issue971.result | 45 ++++++++++++++++++++ mysql-test/suite/tianmu/r/trigger.result | 13 ++++++ mysql-test/suite/tianmu/t/issue971.test | 50 +++++++++++++++++++++++ mysql-test/suite/tianmu/t/trigger.test | 3 ++ storage/tianmu/core/descriptor.cpp | 2 +- storage/tianmu/core/descriptor.h | 1 + 6 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 mysql-test/suite/tianmu/r/issue971.result create mode 100644 mysql-test/suite/tianmu/t/issue971.test diff --git a/mysql-test/suite/tianmu/r/issue971.result b/mysql-test/suite/tianmu/r/issue971.result new file mode 100644 index 000000000..4d46bf381 --- /dev/null +++ b/mysql-test/suite/tianmu/r/issue971.result @@ -0,0 +1,45 @@ +USE test; +set global tianmu_index_search=on; +DROP TABLE IF EXISTS tt1,tt2; +CREATE TABLE tt1(id INT PRIMARY KEY,name VARCHAR(5),copy_id INT) ENGINE=TIANMU; +CREATE TABLE tt2(id INT PRIMARY KEY,name VARCHAR(5),copy_id INT) ENGINE=TIANMU; +INSERT INTO tt1 VALUES(1,'AAA',1),(2,'AAA',2),(3,'BBB',3),(4,'BBB',4),(5,'CCC',5); +INSERT INTO tt2 VALUES(1,'BBB',1),(2,'BBB',2),(3,'CCC',3),(4,'CCC',4),(5,'DDD',5); +SELECT * FROM tt1 WHERE EXISTS (SELECT 1 FROM tt2 WHERE tt1.id = tt2.id AND name = 'BBB'); +id name copy_id +1 AAA 1 +2 AAA 2 +SELECT * FROM tt1 WHERE EXISTS (SELECT 1 FROM tt2 WHERE tt1.id = tt2.id AND tt2.id = 2); +id name copy_id +2 AAA 2 +SELECT * FROM tt1 WHERE EXISTS (SELECT 1 FROM tt2 WHERE tt1.id = tt2.id AND tt2.id > 2); +id name copy_id +3 BBB 3 +4 BBB 4 +5 CCC 5 +SELECT * FROM tt1 WHERE EXISTS (SELECT 1 FROM tt2 WHERE tt1.id = tt2.id AND tt2.id < 2); +id name copy_id +1 AAA 1 +SELECT * FROM tt1 WHERE NOT EXISTS (SELECT 1 FROM tt2 WHERE tt1.id = tt2.id AND name = 'BBB'); +id name copy_id +3 BBB 3 +4 BBB 4 +5 CCC 5 +SELECT * FROM tt1 WHERE NOT EXISTS (SELECT 1 FROM tt2 WHERE tt1.id = tt2.id AND tt2.id = 2); +id name copy_id +1 AAA 1 +3 BBB 3 +4 BBB 4 +5 CCC 5 +SELECT * FROM tt1 WHERE NOT EXISTS (SELECT 1 FROM tt2 WHERE tt1.id = tt2.id AND tt2.id > 2); +id name copy_id +1 AAA 1 +2 AAA 2 +SELECT * FROM tt1 WHERE NOT EXISTS (SELECT 1 FROM tt2 WHERE tt1.id = tt2.id AND tt2.id < 2); +id name copy_id +2 AAA 2 +3 BBB 3 +4 BBB 4 +5 CCC 5 +set global tianmu_index_search=off; +DROP TABLE tt1,tt2; diff --git a/mysql-test/suite/tianmu/r/trigger.result b/mysql-test/suite/tianmu/r/trigger.result index e5a598b30..510149740 100644 --- a/mysql-test/suite/tianmu/r/trigger.result +++ b/mysql-test/suite/tianmu/r/trigger.result @@ -707,12 +707,25 @@ END| UPDATE IGNORE t1 SET a=2 WHERE a=1; Warnings: Warning 1062 Duplicate entry '2' for key 'PRIMARY' +SHOW WARNINGS; +Level Code Message +Warning 1062 Duplicate entry '2' for key 'PRIMARY' SELECT * FROM t2; after_update UPDATE IGNORE t1,t3 SET t1.a=2 WHERE t1.a=1; +Warnings: +Warning 1062 Duplicate entry '2' for key 'PRIMARY' +SHOW WARNINGS; +Level Code Message +Warning 1062 Duplicate entry '2' for key 'PRIMARY' SELECT * FROM t2; after_update UPDATE IGNORE t3,t1 SET t1.a=2 WHERE t1.a=1; +Warnings: +Warning 1062 Duplicate entry '2' for key 'PRIMARY' +SHOW WARNINGS; +Level Code Message +Warning 1062 Duplicate entry '2' for key 'PRIMARY' SELECT * FROM t1; a 1 diff --git a/mysql-test/suite/tianmu/t/issue971.test b/mysql-test/suite/tianmu/t/issue971.test new file mode 100644 index 000000000..91e2094bc --- /dev/null +++ b/mysql-test/suite/tianmu/t/issue971.test @@ -0,0 +1,50 @@ +--source include/have_tianmu.inc + +USE test; + +--disable_warnings + +## enable the tianmu primary key index + +set global tianmu_index_search=on; + +## DDL + +DROP TABLE IF EXISTS tt1,tt2; + +CREATE TABLE tt1(id INT PRIMARY KEY,name VARCHAR(5),copy_id INT) ENGINE=TIANMU; +CREATE TABLE tt2(id INT PRIMARY KEY,name VARCHAR(5),copy_id INT) ENGINE=TIANMU; + +## insert data + +INSERT INTO tt1 VALUES(1,'AAA',1),(2,'AAA',2),(3,'BBB',3),(4,'BBB',4),(5,'CCC',5); +INSERT INTO tt2 VALUES(1,'BBB',1),(2,'BBB',2),(3,'CCC',3),(4,'CCC',4),(5,'DDD',5); + +## subquery EXISTS + +SELECT * FROM tt1 WHERE EXISTS (SELECT 1 FROM tt2 WHERE tt1.id = tt2.id AND name = 'BBB'); + +SELECT * FROM tt1 WHERE EXISTS (SELECT 1 FROM tt2 WHERE tt1.id = tt2.id AND tt2.id = 2); + +SELECT * FROM tt1 WHERE EXISTS (SELECT 1 FROM tt2 WHERE tt1.id = tt2.id AND tt2.id > 2); + +SELECT * FROM tt1 WHERE EXISTS (SELECT 1 FROM tt2 WHERE tt1.id = tt2.id AND tt2.id < 2); + +## subquery NOT EXISTS + +SELECT * FROM tt1 WHERE NOT EXISTS (SELECT 1 FROM tt2 WHERE tt1.id = tt2.id AND name = 'BBB'); + +SELECT * FROM tt1 WHERE NOT EXISTS (SELECT 1 FROM tt2 WHERE tt1.id = tt2.id AND tt2.id = 2); + +SELECT * FROM tt1 WHERE NOT EXISTS (SELECT 1 FROM tt2 WHERE tt1.id = tt2.id AND tt2.id > 2); + +SELECT * FROM tt1 WHERE NOT EXISTS (SELECT 1 FROM tt2 WHERE tt1.id = tt2.id AND tt2.id < 2); + +## disable the tianmu primary key index + +set global tianmu_index_search=off; + +## clean test table + +DROP TABLE tt1,tt2; + diff --git a/mysql-test/suite/tianmu/t/trigger.test b/mysql-test/suite/tianmu/t/trigger.test index 6eb6c5bb6..a5a509004 100644 --- a/mysql-test/suite/tianmu/t/trigger.test +++ b/mysql-test/suite/tianmu/t/trigger.test @@ -763,10 +763,13 @@ END| DELIMITER ;| UPDATE IGNORE t1 SET a=2 WHERE a=1; +SHOW WARNINGS; SELECT * FROM t2; UPDATE IGNORE t1,t3 SET t1.a=2 WHERE t1.a=1; +SHOW WARNINGS; SELECT * FROM t2; UPDATE IGNORE t3,t1 SET t1.a=2 WHERE t1.a=1; +SHOW WARNINGS; SELECT * FROM t1; SELECT * FROM t2; DROP TRIGGER post_update_t1; diff --git a/storage/tianmu/core/descriptor.cpp b/storage/tianmu/core/descriptor.cpp index e06541265..e5ee1f88d 100644 --- a/storage/tianmu/core/descriptor.cpp +++ b/storage/tianmu/core/descriptor.cpp @@ -1906,7 +1906,7 @@ bool Descriptor::ExsitTmpTable() const { } bool Descriptor::IsleftIndexSearch() const { - if (!tianmu_sysvar_index_search || IsType_OrTree()) + if (!tianmu_sysvar_index_search || IsType_OrTree() || IsType_Between()) return false; if (IsType_AttrValOrAttrValVal() && encoded) { auto col = static_cast(attr.vc); diff --git a/storage/tianmu/core/descriptor.h b/storage/tianmu/core/descriptor.h index c2d86ec6f..484d0c61e 100644 --- a/storage/tianmu/core/descriptor.h +++ b/storage/tianmu/core/descriptor.h @@ -124,6 +124,7 @@ class Descriptor { bool IsType_Subquery(); bool IsType_Exists() const { return op == common::Operator::O_EXISTS || op == common::Operator::O_NOT_EXISTS; } bool IsType_In() const { return op == common::Operator::O_IN || op == common::Operator::O_NOT_IN; } + bool IsType_Between() const { return op == common::Operator::O_BETWEEN || op == common::Operator::O_NOT_BETWEEN; } bool IsType_TIANMUExpression() const; // only columns, constants and TIANMUExpressions bool IsType_JoinComplex() const;