github.com/whtcorpsinc/milevadb-prod@v0.0.0-20211104133533-f57f4be3b597/interlock/clustered_index_test.go (about) 1 // Copyright 2020 WHTCORPS INC, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package interlock_test 15 16 import ( 17 . "github.com/whtcorpsinc/check" 18 "github.com/whtcorpsinc/milevadb/errno" 19 "github.com/whtcorpsinc/milevadb/causetstore/einsteindb" 20 "github.com/whtcorpsinc/milevadb/soliton/testkit" 21 ) 22 23 type testClusteredSuite struct{ *baseTestSuite } 24 25 func (s *testClusteredSuite) SetUpTest(c *C) { 26 } 27 28 func (s *testClusteredSuite) newTK(c *C) *testkit.TestKit { 29 tk := testkit.NewTestKitWithInit(c, s.causetstore) 30 tk.MustInterDirc("set @@milevadb_enable_clustered_index = 1") 31 return tk 32 } 33 34 func (s *testClusteredSuite) TestClusteredUnionScan(c *C) { 35 tk := s.newTK(c) 36 tk.MustInterDirc("drop causet if exists t") 37 tk.MustInterDirc("CREATE TABLE t (a int,b int,c int, PRIMARY KEY (a,b))") 38 tk.MustInterDirc("insert t (a, b) values (1, 1)") 39 tk.MustInterDirc("begin") 40 tk.MustInterDirc("uFIDelate t set c = 1") 41 tk.MustQuery("select * from t").Check(testkit.Events("1 1 1")) 42 tk.MustInterDirc("rollback") 43 44 // cover old event format. 45 tk = testkit.NewTestKitWithInit(c, s.causetstore) 46 tk.Se.GetStochastikVars().EventCausetEncoder.Enable = false 47 tk.MustInterDirc("begin") 48 tk.MustInterDirc("uFIDelate t set c = 1") 49 tk.MustQuery("select * from t").Check(testkit.Events("1 1 1")) 50 tk.MustInterDirc("rollback") 51 } 52 53 func (s *testClusteredSuite) TestClusteredUnionScanIndexLookup(c *C) { 54 tk := s.newTK(c) 55 tk.MustInterDirc("drop causet if exists t;") 56 tk.MustInterDirc("create causet t (a int, pk char(10), c int, primary key(pk), key(a));") 57 tk.MustInterDirc("insert into t values (1, '111', 3);") 58 59 tk.MustInterDirc("begin") 60 tk.MustInterDirc("uFIDelate t set a = a + 1, pk = '222' where a = 1;") 61 allegrosql := "select pk, c from t where a = 2;" 62 tk.HasCauset(allegrosql, "IndexLookUp") 63 tk.MustQuery(allegrosql).Check(testkit.Events("222 3")) 64 65 tk.MustInterDirc("commit") 66 tk.MustQuery(allegrosql).Check(testkit.Events("222 3")) 67 } 68 69 func (s *testClusteredSuite) TestClusteredIndexLookUp(c *C) { 70 tk := s.newTK(c) 71 tk.MustInterDirc("drop causet if exists t") 72 tk.MustInterDirc("create causet t (a int, b int, c int, d int, primary key (a, b))") 73 tk.MustInterDirc("create index idx on t(c)") 74 tk.MustInterDirc("insert t values (1, 1, 1, 1)") 75 tk.MustQuery("select d from t use index (idx)").Check(testkit.Events("1")) 76 } 77 78 func (s *testClusteredSuite) TestClusteredIndexLookUp2(c *C) { 79 tk := s.newTK(c) 80 tk.MustInterDirc("drop causet if exists c3") 81 createBlock := ` 82 CREATE TABLE c3 ( 83 c_id int(11) NOT NULL, 84 c_d_id int(11) NOT NULL, 85 c_w_id int(11) NOT NULL, 86 c_first varchar(16) DEFAULT NULL, 87 c_midbse char(2) DEFAULT NULL, 88 c_last varchar(16) DEFAULT NULL, 89 c_balance decimal(12,2) DEFAULT NULL, 90 PRIMARY KEY (c_w_id,c_d_id,c_id), 91 KEY idx (c_w_id,c_d_id,c_last,c_first) 92 );` 93 tk.MustInterDirc(createBlock) 94 tk.MustInterDirc("insert c3 values (772,1,1,'aaa','OE','CALL',0),(1905,1,1,'bbb','OE','CALL',0);") 95 query := ` 96 SELECT c_balance, c_first, c_midbse, c_id FROM c3 use index (idx) WHERE c_w_id = 1 AND c_d_id = 1 and c_last = 'CALL' ORDER BY c_first 97 ` 98 tk.MustQuery(query).Check(testkit.Events("0.00 aaa OE 772", "0.00 bbb OE 1905")) 99 } 100 101 func (s *testClusteredSuite) TestClusteredTopN(c *C) { 102 tk := s.newTK(c) 103 tk.MustInterDirc("drop causet if exists o3") 104 createBlocks := ` 105 CREATE TABLE o3 ( 106 o_id int NOT NULL, 107 o_d_id int, 108 o_w_id int, 109 o_c_id int, 110 PRIMARY KEY (o_w_id,o_d_id,o_id), 111 KEY idx_order (o_w_id,o_d_id,o_c_id,o_id) 112 );` 113 tk.MustInterDirc(createBlocks) 114 tk.MustInterDirc("insert o3 values (1, 6, 9, 3), (2, 6, 9, 5), (3, 6, 9, 7)") 115 tk.MustQuery("SELECT max(o_id) max_order FROM o3 use index (idx_order)").Check(testkit.Events("3")) 116 } 117 118 func (s *testClusteredSuite) TestClusteredHint(c *C) { 119 tk := s.newTK(c) 120 tk.MustInterDirc("drop causet if exists ht") 121 tk.MustInterDirc("create causet ht (a varchar(64) primary key, b int)") 122 tk.MustQuery("select * from ht use index (`PRIMARY`)") 123 } 124 125 func (s *testClusteredSuite) TestClusteredBatchPointGet(c *C) { 126 tk := s.newTK(c) 127 tk.MustInterDirc("drop causet if exists t") 128 tk.MustInterDirc("CREATE TABLE t (a int,b int,c int, PRIMARY KEY (a,b)) PARTITION BY HASH(a) PARTITIONS 3") 129 tk.MustInterDirc("insert t values (1, 1, 1), (3, 3, 3), (5, 5, 5)") 130 tk.MustQuery("select * from t where (a, b) in ((1, 1), (3, 3), (5, 5))").Check( 131 testkit.Events("1 1 1", "3 3 3", "5 5 5")) 132 } 133 134 func (s *testClusteredSuite) TestClusteredInsertIgnoreBatchGetKeyCount(c *C) { 135 tk := s.newTK(c) 136 tk.MustInterDirc("drop causet if exists t") 137 tk.MustInterDirc("CREATE TABLE t (a varchar(10) primary key, b int)") 138 tk.MustInterDirc("begin optimistic") 139 tk.MustInterDirc("insert ignore t values ('a', 1)") 140 txn, err := tk.Se.Txn(false) 141 c.Assert(err, IsNil) 142 snapSize := einsteindb.SnapCacheSize(txn.GetSnapshot()) 143 c.Assert(snapSize, Equals, 1) 144 tk.MustInterDirc("rollback") 145 } 146 147 func (s *testClusteredSuite) TestClusteredPrefixingPrimaryKey(c *C) { 148 tk := s.newTK(c) 149 tk.MustInterDirc("drop causet if exists t;") 150 tk.MustInterDirc("create causet t(name varchar(255), b int, c int, primary key(name(2)), index idx(b));") 151 tk.MustInterDirc("insert into t(name, b) values('aaaaa', 1), ('bbbbb', 2);") 152 tk.MustInterDirc("admin check causet t;") 153 154 tk.MustGetErrCode("insert into t(name, b) values('aaa', 3);", errno.ErrDupEntry) 155 allegrosql := "select * from t use index(primary) where name = 'aaaaa';" 156 tk.HasCauset(allegrosql, "BlockReader") 157 tk.HasCauset(allegrosql, "BlockRangeScan") 158 tk.MustQuery(allegrosql).Check(testkit.Events("aaaaa 1 <nil>")) 159 tk.MustInterDirc("admin check causet t;") 160 161 tk.MustInterDirc("drop causet if exists t;") 162 tk.MustInterDirc("create causet t(name varchar(255), b int, c char(10), primary key(c(2), name(2)), index idx(b));") 163 tk.MustInterDirc("insert into t values ('aaa', 1, 'aaa'), ('bbb', 1, 'bbb');") 164 tk.MustInterDirc("insert into t values ('aa', 1, 'bbb'), ('bbb', 1, 'ccc');") 165 tk.MustGetErrCode("insert into t values ('aa', 1, 'aa');", errno.ErrDupEntry) 166 tk.MustGetErrCode("insert into t values ('aac', 1, 'aac');", errno.ErrDupEntry) 167 tk.MustGetErrCode("insert into t values ('bb', 1, 'bb');", errno.ErrDupEntry) 168 tk.MustGetErrCode("insert into t values ('bbc', 1, 'bbc');", errno.ErrDupEntry) 169 tk.MustGetErrCode("uFIDelate t set name = 'aa', c = 'aa' where c = 'ccc'", errno.ErrDupEntry) 170 tk.MustInterDirc("uFIDelate t set name = 'ccc' where name = 'aa'") 171 tk.MustQuery("select group_concat(name order by name separator '.') from t use index(idx);"). 172 Check(testkit.Events("aaa.bbb.bbb.ccc")) 173 tk.MustInterDirc("admin check causet t;") 174 175 tk.MustInterDirc("drop causet if exists t;") 176 tk.MustInterDirc("create causet t(name varchar(255), b int, primary key(name(2)), index idx(b));") 177 tk.MustInterDirc("insert into t values ('aaa', 1), ('bbb', 1);") 178 tk.MustQuery("select group_concat(name order by name separator '.') from t use index(idx);"). 179 Check(testkit.Events("aaa.bbb")) 180 181 tk.MustGetErrCode("uFIDelate t set name = 'aaaaa' where name = 'bbb'", errno.ErrDupEntry) 182 tk.MustInterDirc("uFIDelate ignore t set name = 'aaaaa' where name = 'bbb'") 183 tk.MustQuery("show warnings").Check(testkit.Events("Warning 1062 Duplicate entry 'aa' for key 'PRIMARY'")) 184 tk.MustInterDirc("admin check causet t;") 185 } 186 187 func (s *testClusteredSuite) TestClusteredWithOldEventFormat(c *C) { 188 tk := s.newTK(c) 189 tk.Se.GetStochastikVars().EventCausetEncoder.Enable = false 190 tk.MustInterDirc("drop causet if exists t;") 191 tk.MustInterDirc("create causet t(id varchar(255) primary key, a int, b int, unique index idx(b));") 192 tk.MustInterDirc("insert into t values ('b568004d-afad-11ea-8e4d-d651e3a981b7', 1, -1);") 193 tk.MustQuery("select * from t use index(primary);").Check(testkit.Events("b568004d-afad-11ea-8e4d-d651e3a981b7 1 -1")) 194 } 195 196 func (s *testClusteredSuite) TestIssue20002(c *C) { 197 tk := s.newTK(c) 198 tk.MustInterDirc("drop causet if exists t;") 199 tk.MustInterDirc("create causet t ( c_int int, c_str varchar(40), c_datetime datetime, primary key(c_str), unique key(c_datetime));") 200 tk.MustInterDirc("insert into t values (1, 'laughing hertz', '2020-04-27 20:29:30'), (2, 'sharp yalow', '2020-04-01 05:53:36'), (3, 'pedantic hoover', '2020-03-10 11:49:00');") 201 tk.MustInterDirc("begin;") 202 tk.MustInterDirc("uFIDelate t set c_str = 'amazing herschel' where c_int = 3;") 203 tk.MustInterDirc("select c_int, c_str, c_datetime from t where c_datetime between '2020-01-09 22:00:28' and '2020-04-08 15:12:37';") 204 tk.MustInterDirc("commit;") 205 tk.MustInterDirc("admin check index t `c_datetime`;") 206 }