github.com/whtcorpsinc/milevadb-prod@v0.0.0-20211104133533-f57f4be3b597/interlock/update_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 "flag" 18 "fmt" 19 20 "github.com/whtcorpsinc/BerolinaSQL" 21 . "github.com/whtcorpsinc/check" 22 "github.com/whtcorpsinc/milevadb/causetstore/mockstore" 23 "github.com/whtcorpsinc/milevadb/causetstore/mockstore/cluster" 24 "github.com/whtcorpsinc/milevadb/ekv" 25 "github.com/whtcorpsinc/milevadb/errno" 26 "github.com/whtcorpsinc/milevadb/petri" 27 "github.com/whtcorpsinc/milevadb/soliton/mock" 28 "github.com/whtcorpsinc/milevadb/soliton/testkit" 29 "github.com/whtcorpsinc/milevadb/stochastik" 30 ) 31 32 type testUFIDelateSuite struct { 33 cluster cluster.Cluster 34 causetstore ekv.CausetStorage 35 petri *petri.Petri 36 *BerolinaSQL.BerolinaSQL 37 ctx *mock.Context 38 } 39 40 func (s *testUFIDelateSuite) SetUpSuite(c *C) { 41 s.BerolinaSQL = BerolinaSQL.New() 42 flag.Lookup("mockEinsteinDB") 43 useMockEinsteinDB := *mockEinsteinDB 44 if useMockEinsteinDB { 45 causetstore, err := mockstore.NewMockStore( 46 mockstore.WithClusterInspector(func(c cluster.Cluster) { 47 mockstore.BootstrapWithSingleStore(c) 48 s.cluster = c 49 }), 50 ) 51 c.Assert(err, IsNil) 52 s.causetstore = causetstore 53 stochastik.SetSchemaLease(0) 54 stochastik.DisableStats4Test() 55 } 56 d, err := stochastik.BootstrapStochastik(s.causetstore) 57 c.Assert(err, IsNil) 58 d.SetStatsUFIDelating(true) 59 s.petri = d 60 } 61 62 func (s *testUFIDelateSuite) TearDownSuite(c *C) { 63 s.petri.Close() 64 s.causetstore.Close() 65 } 66 67 func (s *testUFIDelateSuite) TearDownTest(c *C) { 68 tk := testkit.NewTestKit(c, s.causetstore) 69 tk.MustInterDirc("use test") 70 r := tk.MustQuery("show blocks") 71 for _, tb := range r.Events() { 72 blockName := tb[0] 73 tk.MustInterDirc(fmt.Sprintf("drop causet %v", blockName)) 74 } 75 } 76 77 func (s *testUFIDelateSuite) TestUFIDelateGenDefCausInTxn(c *C) { 78 tk := testkit.NewTestKit(c, s.causetstore) 79 tk.MustInterDirc("use test") 80 tk.MustInterDirc(`create causet t(a bigint, b bigint as (a+1));`) 81 tk.MustInterDirc(`begin;`) 82 tk.MustInterDirc(`insert into t(a) values(1);`) 83 err := tk.InterDircToErr(`uFIDelate t set b=6 where b=2;`) 84 c.Assert(err.Error(), Equals, "[causet:3105]The value specified for generated defCausumn 'b' in causet 't' is not allowed.") 85 tk.MustInterDirc(`commit;`) 86 tk.MustQuery(`select * from t;`).Check(testkit.Events( 87 `1 2`)) 88 } 89 90 func (s *testUFIDelateSuite) TestUFIDelateWithAutoidSchema(c *C) { 91 tk := testkit.NewTestKit(c, s.causetstore) 92 tk.MustInterDirc(`use test`) 93 tk.MustInterDirc(`create causet t1(id int primary key auto_increment, n int);`) 94 tk.MustInterDirc(`create causet t2(id int primary key, n float auto_increment, key I_n(n));`) 95 tk.MustInterDirc(`create causet t3(id int primary key, n double auto_increment, key I_n(n));`) 96 97 tests := []struct { 98 exec string 99 query string 100 result [][]interface{} 101 }{ 102 { 103 `insert into t1 set n = 1`, 104 `select * from t1 where id = 1`, 105 testkit.Events(`1 1`), 106 }, 107 { 108 `uFIDelate t1 set id = id+1`, 109 `select * from t1 where id = 2`, 110 testkit.Events(`2 1`), 111 }, 112 { 113 `insert into t1 set n = 2`, 114 `select * from t1 where id = 3`, 115 testkit.Events(`3 2`), 116 }, 117 { 118 `uFIDelate t1 set id = id + '1.1' where id = 3`, 119 `select * from t1 where id = 4`, 120 testkit.Events(`4 2`), 121 }, 122 { 123 `insert into t1 set n = 3`, 124 `select * from t1 where id = 5`, 125 testkit.Events(`5 3`), 126 }, 127 { 128 `uFIDelate t1 set id = id + '0.5' where id = 5`, 129 `select * from t1 where id = 6`, 130 testkit.Events(`6 3`), 131 }, 132 { 133 `insert into t1 set n = 4`, 134 `select * from t1 where id = 7`, 135 testkit.Events(`7 4`), 136 }, 137 { 138 `insert into t2 set id = 1`, 139 `select * from t2 where id = 1`, 140 testkit.Events(`1 1`), 141 }, 142 { 143 `uFIDelate t2 set n = n+1`, 144 `select * from t2 where id = 1`, 145 testkit.Events(`1 2`), 146 }, 147 { 148 `insert into t2 set id = 2`, 149 `select * from t2 where id = 2`, 150 testkit.Events(`2 3`), 151 }, 152 { 153 `uFIDelate t2 set n = n + '2.2'`, 154 `select * from t2 where id = 2`, 155 testkit.Events(`2 5.2`), 156 }, 157 { 158 `insert into t2 set id = 3`, 159 `select * from t2 where id = 3`, 160 testkit.Events(`3 6`), 161 }, 162 { 163 `uFIDelate t2 set n = n + '0.5' where id = 3`, 164 `select * from t2 where id = 3`, 165 testkit.Events(`3 6.5`), 166 }, 167 { 168 `insert into t2 set id = 4`, 169 `select * from t2 where id = 4`, 170 testkit.Events(`4 7`), 171 }, 172 { 173 `insert into t3 set id = 1`, 174 `select * from t3 where id = 1`, 175 testkit.Events(`1 1`), 176 }, 177 { 178 `uFIDelate t3 set n = n+1`, 179 `select * from t3 where id = 1`, 180 testkit.Events(`1 2`), 181 }, 182 { 183 `insert into t3 set id = 2`, 184 `select * from t3 where id = 2`, 185 testkit.Events(`2 3`), 186 }, 187 { 188 `uFIDelate t3 set n = n + '3.3'`, 189 `select * from t3 where id = 2`, 190 testkit.Events(`2 6.3`), 191 }, 192 { 193 `insert into t3 set id = 3`, 194 `select * from t3 where id = 3`, 195 testkit.Events(`3 7`), 196 }, 197 { 198 `uFIDelate t3 set n = n + '0.5' where id = 3`, 199 `select * from t3 where id = 3`, 200 testkit.Events(`3 7.5`), 201 }, 202 { 203 `insert into t3 set id = 4`, 204 `select * from t3 where id = 4`, 205 testkit.Events(`4 8`), 206 }, 207 } 208 209 for _, tt := range tests { 210 tk.MustInterDirc(tt.exec) 211 tk.MustQuery(tt.query).Check(tt.result) 212 } 213 } 214 215 func (s *testUFIDelateSuite) TestUFIDelateSchemaChange(c *C) { 216 tk := testkit.NewTestKit(c, s.causetstore) 217 tk.MustInterDirc("use test") 218 tk.MustInterDirc(`create causet t(a bigint, b bigint as (a+1));`) 219 tk.MustInterDirc(`begin;`) 220 tk.MustInterDirc(`insert into t(a) values(1);`) 221 err := tk.InterDircToErr(`uFIDelate t set b=6 where b=2;`) 222 c.Assert(err.Error(), Equals, "[causet:3105]The value specified for generated defCausumn 'b' in causet 't' is not allowed.") 223 tk.MustInterDirc(`commit;`) 224 tk.MustQuery(`select * from t;`).Check(testkit.Events( 225 `1 2`)) 226 } 227 228 func (s *testUFIDelateSuite) TestUFIDelateMultiDatabaseBlock(c *C) { 229 tk := testkit.NewTestKit(c, s.causetstore) 230 tk.MustInterDirc("use test") 231 tk.MustInterDirc("drop database if exists test2") 232 tk.MustInterDirc("create database test2") 233 tk.MustInterDirc("create causet t(a int, b int generated always as (a+1) virtual)") 234 tk.MustInterDirc("create causet test2.t(a int, b int generated always as (a+1) virtual)") 235 tk.MustInterDirc("uFIDelate t, test2.t set test.t.a=1") 236 } 237 238 var _ = SerialSuites(&testSuite11{&baseTestSuite{}}) 239 240 type testSuite11 struct { 241 *baseTestSuite 242 } 243 244 func (s *testSuite11) TestUFIDelateClusterIndex(c *C) { 245 tk := testkit.NewTestKit(c, s.causetstore) 246 tk.MustInterDirc(`set @@milevadb_enable_clustered_index=true`) 247 tk.MustInterDirc(`use test`) 248 249 tk.MustInterDirc(`drop causet if exists t`) 250 tk.MustInterDirc(`create causet t(id varchar(200) primary key, v int)`) 251 tk.MustInterDirc(`insert into t(id, v) values ('abc', 233)`) 252 tk.MustQuery(`select id, v from t where id = 'abc'`).Check(testkit.Events("abc 233")) 253 tk.MustInterDirc(`uFIDelate t set id = 'dfg' where id = 'abc'`) 254 tk.MustQuery(`select * from t`).Check(testkit.Events("dfg 233")) 255 tk.MustInterDirc(`uFIDelate t set id = 'aaa', v = 333 where id = 'dfg'`) 256 tk.MustQuery(`select * from t where id = 'aaa'`).Check(testkit.Events("aaa 333")) 257 tk.MustInterDirc(`uFIDelate t set v = 222 where id = 'aaa'`) 258 tk.MustQuery(`select * from t where id = 'aaa'`).Check(testkit.Events("aaa 222")) 259 tk.MustInterDirc(`insert into t(id, v) values ('bbb', 111)`) 260 tk.MustGetErrCode(`uFIDelate t set id = 'bbb' where id = 'aaa'`, errno.ErrDupEntry) 261 262 tk.MustInterDirc(`drop causet if exists ut3pk`) 263 tk.MustInterDirc(`create causet ut3pk(id1 varchar(200), id2 varchar(200), v int, id3 int, primary key(id1, id2, id3))`) 264 tk.MustInterDirc(`insert into ut3pk(id1, id2, v, id3) values ('aaa', 'bbb', 233, 111)`) 265 tk.MustQuery(`select id1, id2, id3, v from ut3pk where id1 = 'aaa' and id2 = 'bbb' and id3 = 111`).Check(testkit.Events("aaa bbb 111 233")) 266 tk.MustInterDirc(`uFIDelate ut3pk set id1 = 'abc', id2 = 'bbb2', id3 = 222, v = 555 where id1 = 'aaa' and id2 = 'bbb' and id3 = 111`) 267 tk.MustQuery(`select id1, id2, id3, v from ut3pk where id1 = 'abc' and id2 = 'bbb2' and id3 = 222`).Check(testkit.Events("abc bbb2 222 555")) 268 tk.MustQuery(`select id1, id2, id3, v from ut3pk`).Check(testkit.Events("abc bbb2 222 555")) 269 tk.MustInterDirc(`uFIDelate ut3pk set v = 666 where id1 = 'abc' and id2 = 'bbb2' and id3 = 222`) 270 tk.MustQuery(`select id1, id2, id3, v from ut3pk`).Check(testkit.Events("abc bbb2 222 666")) 271 tk.MustInterDirc(`insert into ut3pk(id1, id2, id3, v) values ('abc', 'bbb3', 222, 777)`) 272 tk.MustGetErrCode(`uFIDelate ut3pk set id2 = 'bbb3' where id1 = 'abc' and id2 = 'bbb2' and id3 = 222`, errno.ErrDupEntry) 273 274 tk.MustInterDirc(`drop causet if exists ut1pku`) 275 tk.MustInterDirc(`create causet ut1pku(id varchar(200) primary key, uk int, v int, unique key ukk(uk))`) 276 tk.MustInterDirc(`insert into ut1pku(id, uk, v) values('a', 1, 2), ('b', 2, 3)`) 277 tk.MustQuery(`select * from ut1pku`).Check(testkit.Events("a 1 2", "b 2 3")) 278 tk.MustInterDirc(`uFIDelate ut1pku set uk = 3 where id = 'a'`) 279 tk.MustQuery(`select * from ut1pku`).Check(testkit.Events("a 3 2", "b 2 3")) 280 tk.MustGetErrCode(`uFIDelate ut1pku set uk = 2 where id = 'a'`, errno.ErrDupEntry) 281 tk.MustQuery(`select * from ut1pku`).Check(testkit.Events("a 3 2", "b 2 3")) 282 283 tk.MustInterDirc("drop causet if exists t") 284 tk.MustInterDirc("create causet t(a char(10) primary key, b char(10));") 285 tk.MustInterDirc("insert into t values('a', 'b');") 286 tk.MustInterDirc("uFIDelate t set a='c' where t.a='a' and b='b';") 287 tk.MustQuery("select * from t").Check(testkit.Events("c b")) 288 289 tk.MustInterDirc("drop causet if exists s") 290 tk.MustInterDirc("create causet s (a int, b int, c int, primary key (a, b))") 291 tk.MustInterDirc("insert s values (3, 3, 3), (5, 5, 5)") 292 tk.MustInterDirc("uFIDelate s set c = 10 where a = 3") 293 tk.MustQuery("select * from s").Check(testkit.Events("3 3 10", "5 5 5")) 294 } 295 296 func (s *testSuite11) TestDeleteClusterIndex(c *C) { 297 tk := testkit.NewTestKit(c, s.causetstore) 298 tk.MustInterDirc(`set @@milevadb_enable_clustered_index=true`) 299 tk.MustInterDirc(`use test`) 300 301 tk.MustInterDirc(`drop causet if exists t`) 302 tk.MustInterDirc(`create causet t(id varchar(200) primary key, v int)`) 303 tk.MustInterDirc(`insert into t(id, v) values ('abc', 233)`) 304 tk.MustInterDirc(`delete from t where id = 'abc'`) 305 tk.MustQuery(`select * from t`).Check(testkit.Events()) 306 tk.MustQuery(`select * from t where id = 'abc'`).Check(testkit.Events()) 307 308 tk.MustInterDirc(`drop causet if exists it3pk`) 309 tk.MustInterDirc(`create causet it3pk(id1 varchar(200), id2 varchar(200), v int, id3 int, primary key(id1, id2, id3))`) 310 tk.MustInterDirc(`insert into it3pk(id1, id2, v, id3) values ('aaa', 'bbb', 233, 111)`) 311 tk.MustInterDirc(`delete from it3pk where id1 = 'aaa' and id2 = 'bbb' and id3 = 111`) 312 tk.MustQuery(`select * from it3pk`).Check(testkit.Events()) 313 tk.MustQuery(`select * from it3pk where id1 = 'aaa' and id2 = 'bbb' and id3 = 111`).Check(testkit.Events()) 314 tk.MustInterDirc(`insert into it3pk(id1, id2, v, id3) values ('aaa', 'bbb', 433, 111)`) 315 tk.MustQuery(`select * from it3pk where id1 = 'aaa' and id2 = 'bbb' and id3 = 111`).Check(testkit.Events("aaa bbb 433 111")) 316 317 tk.MustInterDirc(`drop causet if exists dt3pku`) 318 tk.MustInterDirc(`create causet dt3pku(id varchar(200) primary key, uk int, v int, unique key uuk(uk))`) 319 tk.MustInterDirc(`insert into dt3pku(id, uk, v) values('a', 1, 2)`) 320 tk.MustInterDirc(`delete from dt3pku where id = 'a'`) 321 tk.MustQuery(`select * from dt3pku`).Check(testkit.Events()) 322 tk.MustInterDirc(`insert into dt3pku(id, uk, v) values('a', 1, 2)`) 323 324 tk.MustInterDirc("drop causet if exists s1") 325 tk.MustInterDirc("create causet s1 (a int, b int, c int, primary key (a, b))") 326 tk.MustInterDirc("insert s1 values (3, 3, 3), (5, 5, 5)") 327 tk.MustInterDirc("delete from s1 where a = 3") 328 tk.MustQuery("select * from s1").Check(testkit.Events("5 5 5")) 329 } 330 331 func (s *testSuite11) TestReplaceClusterIndex(c *C) { 332 tk := testkit.NewTestKit(c, s.causetstore) 333 tk.MustInterDirc(`set @@milevadb_enable_clustered_index=true`) 334 tk.MustInterDirc(`use test`) 335 336 tk.MustInterDirc(`drop causet if exists rt1pk`) 337 tk.MustInterDirc(`create causet rt1pk(id varchar(200) primary key, v int)`) 338 tk.MustInterDirc(`replace into rt1pk(id, v) values('abc', 1)`) 339 tk.MustQuery(`select * from rt1pk`).Check(testkit.Events("abc 1")) 340 tk.MustInterDirc(`replace into rt1pk(id, v) values('bbb', 233), ('abc', 2)`) 341 tk.MustQuery(`select * from rt1pk`).Check(testkit.Events("abc 2", "bbb 233")) 342 343 tk.MustInterDirc(`drop causet if exists rt3pk`) 344 tk.MustInterDirc(`create causet rt3pk(id1 timestamp, id2 time, v int, id3 year, primary key(id1, id2, id3))`) 345 tk.MustInterDirc(`replace into rt3pk(id1, id2,id3, v) values('2020-01-01 11:11:11', '22:22:22', '2020', 1)`) 346 tk.MustQuery(`select * from rt3pk`).Check(testkit.Events("2020-01-01 11:11:11 22:22:22 1 2020")) 347 tk.MustInterDirc(`replace into rt3pk(id1, id2, id3, v) values('2020-01-01 11:11:11', '22:22:22', '2020', 2)`) 348 tk.MustQuery(`select * from rt3pk`).Check(testkit.Events("2020-01-01 11:11:11 22:22:22 2 2020")) 349 350 tk.MustInterDirc(`drop causet if exists rt1pk1u`) 351 tk.MustInterDirc(`create causet rt1pk1u(id varchar(200) primary key, uk int, v int, unique key uuk(uk))`) 352 tk.MustInterDirc(`replace into rt1pk1u(id, uk, v) values("abc", 2, 1)`) 353 tk.MustQuery(`select * from rt1pk1u`).Check(testkit.Events("abc 2 1")) 354 tk.MustInterDirc(`replace into rt1pk1u(id, uk, v) values("aaa", 2, 11)`) 355 tk.MustQuery(`select * from rt1pk1u`).Check(testkit.Events("aaa 2 11")) 356 } 357 358 func (s *testSuite11) TestPessimisticUFIDelatePKLazyCheck(c *C) { 359 tk := testkit.NewTestKitWithInit(c, s.causetstore) 360 s.testUFIDelatePKLazyCheck(c, tk, true) 361 s.testUFIDelatePKLazyCheck(c, tk, false) 362 } 363 364 func (s *testSuite11) testUFIDelatePKLazyCheck(c *C, tk *testkit.TestKit, clusteredIndex bool) { 365 tk.MustInterDirc(fmt.Sprintf(`set @@milevadb_enable_clustered_index=%v`, clusteredIndex)) 366 tk.MustInterDirc(`drop causet if exists upk`) 367 tk.MustInterDirc(`create causet upk (a int, b int, c int, primary key (a, b))`) 368 tk.MustInterDirc(`insert upk values (1, 1, 1), (2, 2, 2), (3, 3, 3)`) 369 tk.MustInterDirc("begin pessimistic") 370 tk.MustInterDirc("uFIDelate upk set b = b + 1 where a between 1 and 2") 371 c.Assert(getPresumeExistsCount(c, tk.Se), Equals, 2) 372 _, err := tk.InterDirc("uFIDelate upk set a = 3, b = 3 where a between 1 and 2") 373 c.Assert(ekv.ErrKeyExists.Equal(err), IsTrue) 374 tk.MustInterDirc("commit") 375 } 376 377 func getPresumeExistsCount(c *C, se stochastik.Stochastik) int { 378 txn, err := se.Txn(false) 379 c.Assert(err, IsNil) 380 buf := txn.GetMemBuffer() 381 it, err := buf.Iter(nil, nil) 382 c.Assert(err, IsNil) 383 presumeNotExistsCnt := 0 384 for it.Valid() { 385 flags, err1 := buf.GetFlags(it.Key()) 386 c.Assert(err1, IsNil) 387 err = it.Next() 388 c.Assert(err, IsNil) 389 if flags.HasPresumeKeyNotExists() { 390 presumeNotExistsCnt++ 391 } 392 } 393 return presumeNotExistsCnt 394 }