github.com/whtcorpsinc/MilevaDB-Prod@v0.0.0-20211104133533-f57f4be3b597/causetstore/stochastik/session_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 stochastik_test 15 16 import ( 17 "context" 18 "flag" 19 "fmt" 20 "os" 21 "path" 22 "strings" 23 "sync" 24 "sync/atomic" 25 "time" 26 27 "github.com/whtcorpsinc/BerolinaSQL" 28 "github.com/whtcorpsinc/BerolinaSQL/allegrosql" 29 "github.com/whtcorpsinc/BerolinaSQL/auth" 30 "github.com/whtcorpsinc/BerolinaSQL/perceptron" 31 "github.com/whtcorpsinc/BerolinaSQL/terror" 32 . "github.com/whtcorpsinc/check" 33 "github.com/whtcorpsinc/errors" 34 "github.com/whtcorpsinc/failpoint" 35 "github.com/whtcorpsinc/fidelpb/go-binlog" 36 "github.com/whtcorpsinc/milevadb/causet/blocks" 37 causetembedded "github.com/whtcorpsinc/milevadb/causet/embedded" 38 "github.com/whtcorpsinc/milevadb/causetstore/einsteindb" 39 "github.com/whtcorpsinc/milevadb/causetstore/mockstore" 40 "github.com/whtcorpsinc/milevadb/causetstore/mockstore/cluster" 41 "github.com/whtcorpsinc/milevadb/causetstore/mockstore/mockeinsteindb" 42 "github.com/whtcorpsinc/milevadb/config" 43 "github.com/whtcorpsinc/milevadb/ekv" 44 "github.com/whtcorpsinc/milevadb/interlock" 45 "github.com/whtcorpsinc/milevadb/petri" 46 "github.com/whtcorpsinc/milevadb/privilege/privileges" 47 "github.com/whtcorpsinc/milevadb/soliton/solitonutil" 48 "github.com/whtcorpsinc/milevadb/soliton/sqlexec" 49 "github.com/whtcorpsinc/milevadb/soliton/testkit" 50 "github.com/whtcorpsinc/milevadb/soliton/testleak" 51 "github.com/whtcorpsinc/milevadb/spacetime/autoid" 52 "github.com/whtcorpsinc/milevadb/stochastik" 53 "github.com/whtcorpsinc/milevadb/stochastikctx" 54 "github.com/whtcorpsinc/milevadb/stochastikctx/binloginfo" 55 "github.com/whtcorpsinc/milevadb/stochastikctx/variable" 56 "github.com/whtcorpsinc/milevadb/types" 57 "go.etcd.io/etcd/clientv3" 58 "google.golang.org/grpc" 59 ) 60 61 var ( 62 withEinsteinDB = flag.Bool("with-einsteindb", false, "run tests with EinsteinDB cluster started. (not use the mock server)") 63 FIDelAddrs = flag.String("fidel-addrs", "127.0.0.1:2379", "fidel addrs") 64 FIDelAddrChan chan string 65 initFIDelAddrsOnce sync.Once 66 ) 67 68 var _ = Suite(&testStochastikSuite{}) 69 var _ = Suite(&testStochastikSuite2{}) 70 var _ = Suite(&testStochastikSuite3{}) 71 var _ = Suite(&testSchemaSuite{}) 72 var _ = Suite(&testIsolationSuite{}) 73 var _ = SerialSuites(&testSchemaSerialSuite{}) 74 var _ = SerialSuites(&testStochastikSerialSuite{}) 75 var _ = SerialSuites(&testBackupRestoreSuite{}) 76 77 type testStochastikSuiteBase struct { 78 cluster cluster.Cluster 79 causetstore ekv.CausetStorage 80 dom *petri.Petri 81 FIDelAddr string 82 } 83 84 type testStochastikSuite struct { 85 testStochastikSuiteBase 86 } 87 88 type testStochastikSuite2 struct { 89 testStochastikSuiteBase 90 } 91 92 type testStochastikSuite3 struct { 93 testStochastikSuiteBase 94 } 95 96 type testStochastikSerialSuite struct { 97 testStochastikSuiteBase 98 } 99 100 type testBackupRestoreSuite struct { 101 testStochastikSuiteBase 102 } 103 104 func clearStorage(causetstore ekv.CausetStorage) error { 105 txn, err := causetstore.Begin() 106 if err != nil { 107 return errors.Trace(err) 108 } 109 iter, err := txn.Iter(nil, nil) 110 if err != nil { 111 return errors.Trace(err) 112 } 113 for iter.Valid() { 114 txn.Delete(iter.Key()) 115 if err := iter.Next(); err != nil { 116 return errors.Trace(err) 117 } 118 } 119 return txn.Commit(context.Background()) 120 } 121 122 func clearETCD(ebd einsteindb.EtcdBackend) error { 123 endpoints, err := ebd.EtcdAddrs() 124 if err != nil { 125 return err 126 } 127 cli, err := clientv3.New(clientv3.Config{ 128 Endpoints: endpoints, 129 AutoSyncInterval: 30 * time.Second, 130 DialTimeout: 5 * time.Second, 131 DialOptions: []grpc.DialOption{ 132 grpc.WithBackoffMaxDelay(time.Second * 3), 133 }, 134 TLS: ebd.TLSConfig(), 135 }) 136 if err != nil { 137 return errors.Trace(err) 138 } 139 defer cli.Close() 140 141 resp, err := cli.Get(context.Background(), "/milevadb", clientv3.WithPrefix()) 142 if err != nil { 143 return errors.Trace(err) 144 } 145 for _, ekv := range resp.Ekvs { 146 if ekv.Lease != 0 { 147 if _, err := cli.Revoke(context.Background(), clientv3.LeaseID(ekv.Lease)); err != nil { 148 return errors.Trace(err) 149 } 150 } 151 } 152 _, err = cli.Delete(context.Background(), "/milevadb", clientv3.WithPrefix()) 153 if err != nil { 154 return errors.Trace(err) 155 } 156 return nil 157 } 158 159 func initFIDelAddrs() { 160 initFIDelAddrsOnce.Do(func() { 161 addrs := strings.Split(*FIDelAddrs, ",") 162 FIDelAddrChan = make(chan string, len(addrs)) 163 for _, addr := range addrs { 164 addr = strings.TrimSpace(addr) 165 if addr != "" { 166 FIDelAddrChan <- addr 167 } 168 } 169 }) 170 } 171 172 func (s *testStochastikSuiteBase) SetUpSuite(c *C) { 173 testleak.BeforeTest() 174 175 if *withEinsteinDB { 176 initFIDelAddrs() 177 s.FIDelAddr = <-FIDelAddrChan 178 var d einsteindb.Driver 179 config.UFIDelateGlobal(func(conf *config.Config) { 180 conf.TxnLocalLatches.Enabled = false 181 }) 182 causetstore, err := d.Open(fmt.Sprintf("einsteindb://%s", s.FIDelAddr)) 183 c.Assert(err, IsNil) 184 err = clearStorage(causetstore) 185 c.Assert(err, IsNil) 186 err = clearETCD(causetstore.(einsteindb.EtcdBackend)) 187 c.Assert(err, IsNil) 188 stochastik.ResetStoreForWithEinsteinDBTest(causetstore) 189 s.causetstore = causetstore 190 } else { 191 causetstore, err := mockstore.NewMockStore( 192 mockstore.WithClusterInspector(func(c cluster.Cluster) { 193 mockstore.BootstrapWithSingleStore(c) 194 s.cluster = c 195 }), 196 ) 197 c.Assert(err, IsNil) 198 s.causetstore = causetstore 199 stochastik.DisableStats4Test() 200 } 201 202 var err error 203 s.dom, err = stochastik.BootstrapStochastik(s.causetstore) 204 c.Assert(err, IsNil) 205 s.dom.GetGlobalVarsCache().Disable() 206 } 207 208 func (s *testStochastikSuiteBase) TearDownSuite(c *C) { 209 s.dom.Close() 210 s.causetstore.Close() 211 testleak.AfterTest(c)() 212 if *withEinsteinDB { 213 FIDelAddrChan <- s.FIDelAddr 214 } 215 } 216 217 func (s *testStochastikSuiteBase) TearDownTest(c *C) { 218 tk := testkit.NewTestKitWithInit(c, s.causetstore) 219 r := tk.MustQuery("show full blocks") 220 for _, tb := range r.Rows() { 221 blockName := tb[0] 222 blockType := tb[1] 223 if blockType == "VIEW" { 224 tk.MustInterDirc(fmt.Sprintf("drop view %v", blockName)) 225 } else if blockType == "BASE TABLE" { 226 tk.MustInterDirc(fmt.Sprintf("drop causet %v", blockName)) 227 } else { 228 panic(fmt.Sprintf("Unexpected causet '%s' with type '%s'.", blockName, blockType)) 229 } 230 } 231 } 232 233 type mockBinlogPump struct { 234 } 235 236 var _ binlog.PumpClient = &mockBinlogPump{} 237 238 func (p *mockBinlogPump) WriteBinlog(ctx context.Context, in *binlog.WriteBinlogReq, opts ...grpc.CallOption) (*binlog.WriteBinlogResp, error) { 239 return &binlog.WriteBinlogResp{}, nil 240 } 241 242 type mockPumpPullBinlogsClient struct { 243 grpc.ClientStream 244 } 245 246 func (m mockPumpPullBinlogsClient) Recv() (*binlog.PullBinlogResp, error) { 247 return nil, nil 248 } 249 250 func (p *mockBinlogPump) PullBinlogs(ctx context.Context, in *binlog.PullBinlogReq, opts ...grpc.CallOption) (binlog.Pump_PullBinlogsClient, error) { 251 return mockPumpPullBinlogsClient{mockeinsteindb.MockGRPCClientStream()}, nil 252 } 253 254 func (s *testStochastikSuite) TestForCoverage(c *C) { 255 // Just for test coverage. 256 tk := testkit.NewTestKitWithInit(c, s.causetstore) 257 tk.MustInterDirc("drop causet if exists t") 258 tk.MustInterDirc("create causet t (id int auto_increment, v int, index (id))") 259 tk.MustInterDirc("insert t values ()") 260 tk.MustInterDirc("insert t values ()") 261 tk.MustInterDirc("insert t values ()") 262 263 // Normal request will not cover txn.Seek. 264 tk.MustInterDirc("admin check causet t") 265 266 // Cover dirty causet operations in StateTxn. 267 tk.Se.GetStochastikVars().BinlogClient = binloginfo.MockPumpsClient(&mockBinlogPump{}) 268 tk.MustInterDirc("begin") 269 tk.MustInterDirc("truncate causet t") 270 tk.MustInterDirc("insert t values ()") 271 tk.MustInterDirc("delete from t where id = 2") 272 tk.MustInterDirc("uFIDelate t set v = 5 where id = 2") 273 tk.MustInterDirc("insert t values ()") 274 tk.MustInterDirc("rollback") 275 276 c.Check(tk.Se.SetDefCauslation(allegrosql.DefaultDefCauslationID), IsNil) 277 278 tk.MustInterDirc("show processlist") 279 _, err := tk.Se.FieldList("t") 280 c.Check(err, IsNil) 281 } 282 283 func (s *testStochastikSuite2) TestErrorRollback(c *C) { 284 tk := testkit.NewTestKitWithInit(c, s.causetstore) 285 tk.MustInterDirc("drop causet if exists t_rollback") 286 tk.MustInterDirc("create causet t_rollback (c1 int, c2 int, primary key(c1))") 287 tk.MustInterDirc("insert into t_rollback values (0, 0)") 288 289 var wg sync.WaitGroup 290 cnt := 4 291 wg.Add(cnt) 292 num := 20 293 294 for i := 0; i < cnt; i++ { 295 go func() { 296 defer wg.Done() 297 localTk := testkit.NewTestKitWithInit(c, s.causetstore) 298 localTk.MustInterDirc("set @@stochastik.milevadb_retry_limit = 100") 299 for j := 0; j < num; j++ { 300 localTk.InterDirc("insert into t_rollback values (1, 1)") 301 localTk.MustInterDirc("uFIDelate t_rollback set c2 = c2 + 1 where c1 = 0") 302 } 303 }() 304 } 305 306 wg.Wait() 307 tk.MustQuery("select c2 from t_rollback where c1 = 0").Check(testkit.Rows(fmt.Sprint(cnt * num))) 308 } 309 310 func (s *testStochastikSuite) TestQueryString(c *C) { 311 tk := testkit.NewTestKitWithInit(c, s.causetstore) 312 313 tk.MustInterDirc("create causet mutil1 (a int);create causet multi2 (a int)") 314 queryStr := tk.Se.Value(stochastikctx.QueryString) 315 c.Assert(queryStr, Equals, "create causet multi2 (a int)") 316 317 // Test execution of DBS through the "InterDircutePreparedStmt" interface. 318 _, err := tk.Se.InterDircute(context.Background(), "use test;") 319 c.Assert(err, IsNil) 320 _, err = tk.Se.InterDircute(context.Background(), "CREATE TABLE t (id bigint PRIMARY KEY, age int)") 321 c.Assert(err, IsNil) 322 _, err = tk.Se.InterDircute(context.Background(), "show create causet t") 323 c.Assert(err, IsNil) 324 id, _, _, err := tk.Se.PrepareStmt("CREATE TABLE t2(id bigint PRIMARY KEY, age int)") 325 c.Assert(err, IsNil) 326 params := []types.Causet{} 327 _, err = tk.Se.InterDircutePreparedStmt(context.Background(), id, params) 328 c.Assert(err, IsNil) 329 qs := tk.Se.Value(stochastikctx.QueryString) 330 c.Assert(qs.(string), Equals, "CREATE TABLE t2(id bigint PRIMARY KEY, age int)") 331 332 // Test execution of DBS through the "InterDircute" interface. 333 _, err = tk.Se.InterDircute(context.Background(), "use test;") 334 c.Assert(err, IsNil) 335 _, err = tk.Se.InterDircute(context.Background(), "drop causet t2") 336 c.Assert(err, IsNil) 337 _, err = tk.Se.InterDircute(context.Background(), "prepare stmt from 'CREATE TABLE t2(id bigint PRIMARY KEY, age int)'") 338 c.Assert(err, IsNil) 339 _, err = tk.Se.InterDircute(context.Background(), "execute stmt") 340 c.Assert(err, IsNil) 341 qs = tk.Se.Value(stochastikctx.QueryString) 342 c.Assert(qs.(string), Equals, "CREATE TABLE t2(id bigint PRIMARY KEY, age int)") 343 } 344 345 func (s *testStochastikSuite) TestAffectedRows(c *C) { 346 tk := testkit.NewTestKitWithInit(c, s.causetstore) 347 348 tk.MustInterDirc("drop causet if exists t") 349 tk.MustInterDirc("create causet t(id TEXT)") 350 tk.MustInterDirc(`INSERT INTO t VALUES ("a");`) 351 c.Assert(int(tk.Se.AffectedRows()), Equals, 1) 352 tk.MustInterDirc(`INSERT INTO t VALUES ("b");`) 353 c.Assert(int(tk.Se.AffectedRows()), Equals, 1) 354 tk.MustInterDirc(`UFIDelATE t set id = 'c' where id = 'a';`) 355 c.Assert(int(tk.Se.AffectedRows()), Equals, 1) 356 tk.MustInterDirc(`UFIDelATE t set id = 'a' where id = 'a';`) 357 c.Assert(int(tk.Se.AffectedRows()), Equals, 0) 358 tk.MustQuery(`SELECT * from t`).Check(testkit.Rows("c", "b")) 359 c.Assert(int(tk.Se.AffectedRows()), Equals, 0) 360 361 tk.MustInterDirc("drop causet if exists t") 362 tk.MustInterDirc("create causet t (id int, data int)") 363 tk.MustInterDirc(`INSERT INTO t VALUES (1, 0), (0, 0), (1, 1);`) 364 tk.MustInterDirc(`UFIDelATE t set id = 1 where data = 0;`) 365 c.Assert(int(tk.Se.AffectedRows()), Equals, 1) 366 367 tk.MustInterDirc("drop causet if exists t") 368 tk.MustInterDirc("create causet t (id int, c1 timestamp);") 369 tk.MustInterDirc(`insert t values(1, 0);`) 370 tk.MustInterDirc(`UFIDelATE t set id = 1 where id = 1;`) 371 c.Assert(int(tk.Se.AffectedRows()), Equals, 0) 372 373 // With ON DUPLICATE KEY UFIDelATE, the affected-rows value per event is 1 if the event is inserted as a new event, 374 // 2 if an existing event is uFIDelated, and 0 if an existing event is set to its current values. 375 tk.MustInterDirc("drop causet if exists t") 376 tk.MustInterDirc("create causet t (c1 int PRIMARY KEY, c2 int);") 377 tk.MustInterDirc(`insert t values(1, 1);`) 378 tk.MustInterDirc(`insert into t values (1, 1) on duplicate key uFIDelate c2=2;`) 379 c.Assert(int(tk.Se.AffectedRows()), Equals, 2) 380 tk.MustInterDirc(`insert into t values (1, 1) on duplicate key uFIDelate c2=2;`) 381 c.Assert(int(tk.Se.AffectedRows()), Equals, 0) 382 tk.MustInterDirc("drop causet if exists test") 383 createALLEGROSQL := `CREATE TABLE test ( 384 id VARCHAR(36) PRIMARY KEY NOT NULL, 385 factor INTEGER NOT NULL DEFAULT 2);` 386 tk.MustInterDirc(createALLEGROSQL) 387 insertALLEGROSQL := `INSERT INTO test(id) VALUES('id') ON DUPLICATE KEY UFIDelATE factor=factor+3;` 388 tk.MustInterDirc(insertALLEGROSQL) 389 c.Assert(int(tk.Se.AffectedRows()), Equals, 1) 390 tk.MustInterDirc(insertALLEGROSQL) 391 c.Assert(int(tk.Se.AffectedRows()), Equals, 2) 392 tk.MustInterDirc(insertALLEGROSQL) 393 c.Assert(int(tk.Se.AffectedRows()), Equals, 2) 394 395 tk.Se.SetClientCapability(allegrosql.ClientFoundRows) 396 tk.MustInterDirc("drop causet if exists t") 397 tk.MustInterDirc("create causet t (id int, data int)") 398 tk.MustInterDirc(`INSERT INTO t VALUES (1, 0), (0, 0), (1, 1);`) 399 tk.MustInterDirc(`UFIDelATE t set id = 1 where data = 0;`) 400 c.Assert(int(tk.Se.AffectedRows()), Equals, 2) 401 } 402 403 func (s *testStochastikSuite3) TestLastMessage(c *C) { 404 tk := testkit.NewTestKitWithInit(c, s.causetstore) 405 406 tk.MustInterDirc("drop causet if exists t") 407 tk.MustInterDirc("create causet t(id TEXT)") 408 409 // Insert 410 tk.MustInterDirc(`INSERT INTO t VALUES ("a");`) 411 tk.CheckLastMessage("") 412 tk.MustInterDirc(`INSERT INTO t VALUES ("b"), ("c");`) 413 tk.CheckLastMessage("Records: 2 Duplicates: 0 Warnings: 0") 414 415 // UFIDelate 416 tk.MustInterDirc(`UFIDelATE t set id = 'c' where id = 'a';`) 417 c.Assert(int(tk.Se.AffectedRows()), Equals, 1) 418 tk.CheckLastMessage("Rows matched: 1 Changed: 1 Warnings: 0") 419 tk.MustInterDirc(`UFIDelATE t set id = 'a' where id = 'a';`) 420 c.Assert(int(tk.Se.AffectedRows()), Equals, 0) 421 tk.CheckLastMessage("Rows matched: 0 Changed: 0 Warnings: 0") 422 423 // Replace 424 tk.MustInterDirc(`drop causet if exists t, t1; 425 create causet t (c1 int PRIMARY KEY, c2 int); 426 create causet t1 (a1 int, a2 int);`) 427 tk.MustInterDirc(`INSERT INTO t VALUES (1,1)`) 428 tk.MustInterDirc(`REPLACE INTO t VALUES (2,2)`) 429 tk.CheckLastMessage("") 430 tk.MustInterDirc(`INSERT INTO t1 VALUES (1,10), (3,30);`) 431 tk.CheckLastMessage("Records: 2 Duplicates: 0 Warnings: 0") 432 tk.MustInterDirc(`REPLACE INTO t SELECT * from t1`) 433 tk.CheckLastMessage("Records: 2 Duplicates: 1 Warnings: 0") 434 435 // Check insert with CLIENT_FOUND_ROWS is set 436 tk.Se.SetClientCapability(allegrosql.ClientFoundRows) 437 tk.MustInterDirc(`drop causet if exists t, t1; 438 create causet t (c1 int PRIMARY KEY, c2 int); 439 create causet t1 (a1 int, a2 int);`) 440 tk.MustInterDirc(`INSERT INTO t1 VALUES (1, 10), (2, 2), (3, 30);`) 441 tk.MustInterDirc(`INSERT INTO t1 VALUES (1, 10), (2, 20), (3, 30);`) 442 tk.MustInterDirc(`INSERT INTO t SELECT * FROM t1 ON DUPLICATE KEY UFIDelATE c2=a2;`) 443 tk.CheckLastMessage("Records: 6 Duplicates: 3 Warnings: 0") 444 } 445 446 // TestRowLock . See http://dev.allegrosql.com/doc/refman/5.7/en/commit.html. 447 func (s *testStochastikSuite) TestRowLock(c *C) { 448 tk := testkit.NewTestKitWithInit(c, s.causetstore) 449 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 450 tk2 := testkit.NewTestKitWithInit(c, s.causetstore) 451 452 tk.MustInterDirc("drop causet if exists t") 453 txn, err := tk.Se.Txn(true) 454 c.Assert(ekv.ErrInvalidTxn.Equal(err), IsTrue) 455 c.Assert(txn.Valid(), IsFalse) 456 tk.MustInterDirc("create causet t (c1 int, c2 int, c3 int)") 457 tk.MustInterDirc("insert t values (11, 2, 3)") 458 tk.MustInterDirc("insert t values (12, 2, 3)") 459 tk.MustInterDirc("insert t values (13, 2, 3)") 460 461 tk1.MustInterDirc("set @@milevadb_disable_txn_auto_retry = 0") 462 tk1.MustInterDirc("begin") 463 tk1.MustInterDirc("uFIDelate t set c2=21 where c1=11") 464 465 tk2.MustInterDirc("begin") 466 tk2.MustInterDirc("uFIDelate t set c2=211 where c1=11") 467 tk2.MustInterDirc("commit") 468 469 // tk1 will retry and the final value is 21 470 tk1.MustInterDirc("commit") 471 472 // Check the result is correct 473 tk.MustQuery("select c2 from t where c1=11").Check(testkit.Rows("21")) 474 475 tk1.MustInterDirc("begin") 476 tk1.MustInterDirc("uFIDelate t set c2=21 where c1=11") 477 478 tk2.MustInterDirc("begin") 479 tk2.MustInterDirc("uFIDelate t set c2=22 where c1=12") 480 tk2.MustInterDirc("commit") 481 482 tk1.MustInterDirc("commit") 483 } 484 485 // TestAutocommit . See https://dev.allegrosql.com/doc/internals/en/status-flags.html 486 func (s *testStochastikSuite) TestAutocommit(c *C) { 487 tk := testkit.NewTestKitWithInit(c, s.causetstore) 488 489 tk.MustInterDirc("drop causet if exists t;") 490 c.Assert(int(tk.Se.Status()&allegrosql.ServerStatusAutocommit), Greater, 0) 491 tk.MustInterDirc("create causet t (id BIGINT PRIMARY KEY AUTO_INCREMENT NOT NULL)") 492 c.Assert(int(tk.Se.Status()&allegrosql.ServerStatusAutocommit), Greater, 0) 493 tk.MustInterDirc("insert t values ()") 494 c.Assert(int(tk.Se.Status()&allegrosql.ServerStatusAutocommit), Greater, 0) 495 tk.MustInterDirc("begin") 496 c.Assert(int(tk.Se.Status()&allegrosql.ServerStatusAutocommit), Greater, 0) 497 tk.MustInterDirc("insert t values ()") 498 c.Assert(int(tk.Se.Status()&allegrosql.ServerStatusAutocommit), Greater, 0) 499 tk.MustInterDirc("drop causet if exists t") 500 c.Assert(int(tk.Se.Status()&allegrosql.ServerStatusAutocommit), Greater, 0) 501 502 tk.MustInterDirc("create causet t (id BIGINT PRIMARY KEY AUTO_INCREMENT NOT NULL)") 503 c.Assert(int(tk.Se.Status()&allegrosql.ServerStatusAutocommit), Greater, 0) 504 tk.MustInterDirc("set autocommit=0") 505 c.Assert(int(tk.Se.Status()&allegrosql.ServerStatusAutocommit), Equals, 0) 506 tk.MustInterDirc("insert t values ()") 507 c.Assert(int(tk.Se.Status()&allegrosql.ServerStatusAutocommit), Equals, 0) 508 tk.MustInterDirc("commit") 509 c.Assert(int(tk.Se.Status()&allegrosql.ServerStatusAutocommit), Equals, 0) 510 tk.MustInterDirc("drop causet if exists t") 511 c.Assert(int(tk.Se.Status()&allegrosql.ServerStatusAutocommit), Equals, 0) 512 tk.MustInterDirc("set autocommit='On'") 513 c.Assert(int(tk.Se.Status()&allegrosql.ServerStatusAutocommit), Greater, 0) 514 515 // When autocommit is 0, transaction start ts should be the first *valid* 516 // memex, rather than *any* memex. 517 tk.MustInterDirc("create causet t (id int)") 518 tk.MustInterDirc("set @@autocommit = 0") 519 tk.MustInterDirc("rollback") 520 tk.MustInterDirc("set @@autocommit = 0") 521 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 522 tk1.MustInterDirc("insert into t select 1") 523 tk.MustQuery("select * from t").Check(testkit.Rows("1")) 524 525 // TODO: MyALLEGROSQL compatibility for setting global variable. 526 // tk.MustInterDirc("begin") 527 // tk.MustInterDirc("insert into t values (42)") 528 // tk.MustInterDirc("set @@global.autocommit = 1") 529 // tk.MustInterDirc("rollback") 530 // tk.MustQuery("select count(*) from t where id = 42").Check(testkit.Rows("0")) 531 // Even the transaction is rollbacked, the set memex succeed. 532 // tk.MustQuery("select @@global.autocommit").Rows("1") 533 } 534 535 // TestTxnLazyInitialize tests that when autocommit = 0, not all memex starts 536 // a new transaction. 537 func (s *testStochastikSuite) TestTxnLazyInitialize(c *C) { 538 testTxnLazyInitialize(s, c, false) 539 testTxnLazyInitialize(s, c, true) 540 } 541 542 func testTxnLazyInitialize(s *testStochastikSuite, c *C, isPessimistic bool) { 543 tk := testkit.NewTestKitWithInit(c, s.causetstore) 544 tk.MustInterDirc("drop causet if exists t") 545 tk.MustInterDirc("create causet t (id int)") 546 if isPessimistic { 547 tk.MustInterDirc("set milevadb_txn_mode = 'pessimistic'") 548 } 549 550 tk.MustInterDirc("set @@autocommit = 0") 551 _, err := tk.Se.Txn(true) 552 c.Assert(ekv.ErrInvalidTxn.Equal(err), IsTrue) 553 txn, err := tk.Se.Txn(false) 554 c.Assert(err, IsNil) 555 c.Assert(txn.Valid(), IsFalse) 556 tk.MustQuery("select @@milevadb_current_ts").Check(testkit.Rows("0")) 557 tk.MustQuery("select @@milevadb_current_ts").Check(testkit.Rows("0")) 558 559 // Those memex should not start a new transaction automacally. 560 tk.MustQuery("select 1") 561 tk.MustQuery("select @@milevadb_current_ts").Check(testkit.Rows("0")) 562 563 tk.MustInterDirc("set @@milevadb_general_log = 0") 564 tk.MustQuery("select @@milevadb_current_ts").Check(testkit.Rows("0")) 565 566 tk.MustQuery("explain select * from t") 567 tk.MustQuery("select @@milevadb_current_ts").Check(testkit.Rows("0")) 568 569 // Begin memex should start a new transaction. 570 tk.MustInterDirc("begin") 571 txn, err = tk.Se.Txn(false) 572 c.Assert(err, IsNil) 573 c.Assert(txn.Valid(), IsTrue) 574 tk.MustInterDirc("rollback") 575 576 tk.MustInterDirc("select * from t") 577 txn, err = tk.Se.Txn(false) 578 c.Assert(err, IsNil) 579 c.Assert(txn.Valid(), IsTrue) 580 tk.MustInterDirc("rollback") 581 582 tk.MustInterDirc("insert into t values (1)") 583 txn, err = tk.Se.Txn(false) 584 c.Assert(err, IsNil) 585 c.Assert(txn.Valid(), IsTrue) 586 tk.MustInterDirc("rollback") 587 } 588 589 func (s *testStochastikSuite) TestGlobalVarAccessor(c *C) { 590 varName := "max_allowed_packet" 591 varValue := "67108864" // This is the default value for max_allowed_packet 592 varValue1 := "4194305" 593 varValue2 := "4194306" 594 595 tk := testkit.NewTestKitWithInit(c, s.causetstore) 596 se := tk.Se.(variable.GlobalVarAccessor) 597 // Get globalSysVar twice and get the same value 598 v, err := se.GetGlobalSysVar(varName) 599 c.Assert(err, IsNil) 600 c.Assert(v, Equals, varValue) 601 v, err = se.GetGlobalSysVar(varName) 602 c.Assert(err, IsNil) 603 c.Assert(v, Equals, varValue) 604 // Set global var to another value 605 err = se.SetGlobalSysVar(varName, varValue1) 606 c.Assert(err, IsNil) 607 v, err = se.GetGlobalSysVar(varName) 608 c.Assert(err, IsNil) 609 c.Assert(v, Equals, varValue1) 610 c.Assert(tk.Se.CommitTxn(context.TODO()), IsNil) 611 612 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 613 se1 := tk1.Se.(variable.GlobalVarAccessor) 614 v, err = se1.GetGlobalSysVar(varName) 615 c.Assert(err, IsNil) 616 c.Assert(v, Equals, varValue1) 617 err = se1.SetGlobalSysVar(varName, varValue2) 618 c.Assert(err, IsNil) 619 v, err = se1.GetGlobalSysVar(varName) 620 c.Assert(err, IsNil) 621 c.Assert(v, Equals, varValue2) 622 c.Assert(tk1.Se.CommitTxn(context.TODO()), IsNil) 623 624 // Make sure the change is visible to any client that accesses that global variable. 625 v, err = se.GetGlobalSysVar(varName) 626 c.Assert(err, IsNil) 627 c.Assert(v, Equals, varValue2) 628 629 // For issue 10955, make sure the new stochastik load `max_execution_time` into stochastikVars. 630 s.dom.GetGlobalVarsCache().Disable() 631 tk1.MustInterDirc("set @@global.max_execution_time = 100") 632 tk2 := testkit.NewTestKitWithInit(c, s.causetstore) 633 c.Assert(tk2.Se.GetStochastikVars().MaxInterDircutionTime, Equals, uint64(100)) 634 tk1.MustInterDirc("set @@global.max_execution_time = 0") 635 636 result := tk.MustQuery("show global variables where variable_name='sql_select_limit';") 637 result.Check(testkit.Rows("sql_select_limit 18446744073709551615")) 638 result = tk.MustQuery("show stochastik variables where variable_name='sql_select_limit';") 639 result.Check(testkit.Rows("sql_select_limit 18446744073709551615")) 640 tk.MustInterDirc("set stochastik sql_select_limit=100000000000;") 641 result = tk.MustQuery("show global variables where variable_name='sql_select_limit';") 642 result.Check(testkit.Rows("sql_select_limit 18446744073709551615")) 643 result = tk.MustQuery("show stochastik variables where variable_name='sql_select_limit';") 644 result.Check(testkit.Rows("sql_select_limit 100000000000")) 645 tk.MustInterDirc("set @@global.sql_select_limit = 1") 646 result = tk.MustQuery("show global variables where variable_name='sql_select_limit';") 647 result.Check(testkit.Rows("sql_select_limit 1")) 648 tk.MustInterDirc("set @@global.sql_select_limit = default") 649 result = tk.MustQuery("show global variables where variable_name='sql_select_limit';") 650 result.Check(testkit.Rows("sql_select_limit 18446744073709551615")) 651 652 result = tk.MustQuery("select @@global.autocommit;") 653 result.Check(testkit.Rows("1")) 654 result = tk.MustQuery("select @@autocommit;") 655 result.Check(testkit.Rows("1")) 656 tk.MustInterDirc("set @@global.autocommit = 0;") 657 result = tk.MustQuery("select @@global.autocommit;") 658 result.Check(testkit.Rows("0")) 659 result = tk.MustQuery("select @@autocommit;") 660 result.Check(testkit.Rows("1")) 661 tk.MustInterDirc("set @@global.autocommit=1") 662 663 _, err = tk.InterDirc("set global time_zone = 'timezone'") 664 c.Assert(err, NotNil) 665 c.Assert(terror.ErrorEqual(err, variable.ErrUnknownTimeZone), IsTrue) 666 } 667 668 func (s *testStochastikSuite) TestGetSysVariables(c *C) { 669 tk := testkit.NewTestKitWithInit(c, s.causetstore) 670 671 // Test ScopeStochastik 672 tk.MustInterDirc("select @@warning_count") 673 tk.MustInterDirc("select @@stochastik.warning_count") 674 tk.MustInterDirc("select @@local.warning_count") 675 _, err := tk.InterDirc("select @@global.warning_count") 676 c.Assert(terror.ErrorEqual(err, variable.ErrIncorrectScope), IsTrue, Commentf("err %v", err)) 677 678 // Test ScopeGlobal 679 tk.MustInterDirc("select @@max_connections") 680 tk.MustInterDirc("select @@global.max_connections") 681 _, err = tk.InterDirc("select @@stochastik.max_connections") 682 c.Assert(terror.ErrorEqual(err, variable.ErrIncorrectScope), IsTrue, Commentf("err %v", err)) 683 _, err = tk.InterDirc("select @@local.max_connections") 684 c.Assert(terror.ErrorEqual(err, variable.ErrIncorrectScope), IsTrue, Commentf("err %v", err)) 685 686 // Test ScopeNone 687 tk.MustInterDirc("select @@performance_schema_max_mutex_classes") 688 tk.MustInterDirc("select @@global.performance_schema_max_mutex_classes") 689 // For issue 19524, test 690 tk.MustInterDirc("select @@stochastik.performance_schema_max_mutex_classes") 691 tk.MustInterDirc("select @@local.performance_schema_max_mutex_classes") 692 } 693 694 func (s *testStochastikSuite) TestRetryResetStmtCtx(c *C) { 695 tk := testkit.NewTestKitWithInit(c, s.causetstore) 696 tk.MustInterDirc("create causet retrytxn (a int unique, b int)") 697 tk.MustInterDirc("insert retrytxn values (1, 1)") 698 tk.MustInterDirc("set @@milevadb_disable_txn_auto_retry = 0") 699 tk.MustInterDirc("begin") 700 tk.MustInterDirc("uFIDelate retrytxn set b = b + 1 where a = 1") 701 702 // Make retryable error. 703 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 704 tk1.MustInterDirc("uFIDelate retrytxn set b = b + 1 where a = 1") 705 706 err := tk.Se.CommitTxn(context.TODO()) 707 c.Assert(err, IsNil) 708 c.Assert(tk.Se.AffectedRows(), Equals, uint64(1)) 709 } 710 711 func (s *testStochastikSuite) TestRetryCleanTxn(c *C) { 712 tk := testkit.NewTestKitWithInit(c, s.causetstore) 713 tk.MustInterDirc("create causet retrytxn (a int unique, b int)") 714 tk.MustInterDirc("insert retrytxn values (1, 1)") 715 tk.MustInterDirc("begin") 716 tk.MustInterDirc("uFIDelate retrytxn set b = b + 1 where a = 1") 717 718 // Make retryable error. 719 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 720 tk1.MustInterDirc("uFIDelate retrytxn set b = b + 1 where a = 1") 721 722 // Hijack retry history, add a memex that returns error. 723 history := stochastik.GetHistory(tk.Se) 724 stmtNode, err := BerolinaSQL.New().ParseOneStmt("insert retrytxn values (2, 'a')", "", "") 725 c.Assert(err, IsNil) 726 compiler := interlock.Compiler{Ctx: tk.Se} 727 stmt, _ := compiler.Compile(context.TODO(), stmtNode) 728 interlock.ResetContextOfStmt(tk.Se, stmtNode) 729 history.Add(stmt, tk.Se.GetStochastikVars().StmtCtx) 730 _, err = tk.InterDirc("commit") 731 c.Assert(err, NotNil) 732 txn, err := tk.Se.Txn(false) 733 c.Assert(err, IsNil) 734 c.Assert(txn.Valid(), IsFalse) 735 c.Assert(tk.Se.GetStochastikVars().InTxn(), IsFalse) 736 } 737 738 func (s *testStochastikSuite) TestReadOnlyNotInHistory(c *C) { 739 tk := testkit.NewTestKitWithInit(c, s.causetstore) 740 tk.MustInterDirc("create causet history (a int)") 741 tk.MustInterDirc("insert history values (1), (2), (3)") 742 tk.MustInterDirc("set @@autocommit = 0") 743 tk.MustInterDirc("set milevadb_disable_txn_auto_retry = 0") 744 tk.MustQuery("select * from history") 745 history := stochastik.GetHistory(tk.Se) 746 c.Assert(history.Count(), Equals, 0) 747 748 tk.MustInterDirc("insert history values (4)") 749 tk.MustInterDirc("insert history values (5)") 750 c.Assert(history.Count(), Equals, 2) 751 tk.MustInterDirc("commit") 752 tk.MustQuery("select * from history") 753 history = stochastik.GetHistory(tk.Se) 754 c.Assert(history.Count(), Equals, 0) 755 } 756 757 func (s *testStochastikSuite) TestRetryUnion(c *C) { 758 tk := testkit.NewTestKitWithInit(c, s.causetstore) 759 tk.MustInterDirc("create causet history (a int)") 760 tk.MustInterDirc("insert history values (1), (2), (3)") 761 tk.MustInterDirc("set @@autocommit = 0") 762 tk.MustInterDirc("set milevadb_disable_txn_auto_retry = 0") 763 // UNION should't be in retry history. 764 tk.MustQuery("(select * from history) union (select * from history)") 765 history := stochastik.GetHistory(tk.Se) 766 c.Assert(history.Count(), Equals, 0) 767 tk.MustQuery("(select * from history for uFIDelate) union (select * from history)") 768 tk.MustInterDirc("uFIDelate history set a = a + 1") 769 history = stochastik.GetHistory(tk.Se) 770 c.Assert(history.Count(), Equals, 2) 771 772 // Make retryable error. 773 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 774 tk1.MustInterDirc("uFIDelate history set a = a + 1") 775 776 _, err := tk.InterDirc("commit") 777 c.Assert(err, ErrorMatches, ".*can not retry select for uFIDelate memex") 778 } 779 780 func (s *testStochastikSuite) TestRetryShow(c *C) { 781 tk := testkit.NewTestKitWithInit(c, s.causetstore) 782 tk.MustInterDirc("set @@autocommit = 0") 783 tk.MustInterDirc("set milevadb_disable_txn_auto_retry = 0") 784 // UNION should't be in retry history. 785 tk.MustQuery("show variables") 786 tk.MustQuery("show databases") 787 history := stochastik.GetHistory(tk.Se) 788 c.Assert(history.Count(), Equals, 0) 789 } 790 791 func (s *testStochastikSuite) TestNoRetryForCurrentTxn(c *C) { 792 tk := testkit.NewTestKitWithInit(c, s.causetstore) 793 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 794 tk.MustInterDirc("create causet history (a int)") 795 tk.MustInterDirc("insert history values (1)") 796 797 // Firstly, disable retry. 798 tk.MustInterDirc("set milevadb_disable_txn_auto_retry = 1") 799 tk.MustInterDirc("begin") 800 tk.MustInterDirc("uFIDelate history set a = 2") 801 // Enable retry now. 802 tk.MustInterDirc("set milevadb_disable_txn_auto_retry = 0") 803 804 tk1.MustInterDirc("uFIDelate history set a = 3") 805 c.Assert(tk.InterDircToErr("commit"), NotNil) 806 } 807 808 func (s *testStochastikSuite) TestRetryForCurrentTxn(c *C) { 809 tk := testkit.NewTestKitWithInit(c, s.causetstore) 810 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 811 tk.MustInterDirc("create causet history (a int)") 812 tk.MustInterDirc("insert history values (1)") 813 814 // Firstly, enable retry. 815 tk.MustInterDirc("set milevadb_disable_txn_auto_retry = 0") 816 tk.MustInterDirc("begin") 817 tk.MustInterDirc("uFIDelate history set a = 2") 818 // Disable retry now. 819 tk.MustInterDirc("set milevadb_disable_txn_auto_retry = 1") 820 821 tk1.MustInterDirc("uFIDelate history set a = 3") 822 tk.MustInterDirc("commit") 823 tk.MustQuery("select * from history").Check(testkit.Rows("2")) 824 } 825 826 // TestTruncateAlloc tests that the auto_increment ID does not reuse the old causet's allocator. 827 func (s *testStochastikSuite) TestTruncateAlloc(c *C) { 828 tk := testkit.NewTestKitWithInit(c, s.causetstore) 829 tk.MustInterDirc("create causet truncate_id (a int primary key auto_increment)") 830 tk.MustInterDirc("insert truncate_id values (), (), (), (), (), (), (), (), (), ()") 831 tk.MustInterDirc("truncate causet truncate_id") 832 tk.MustInterDirc("insert truncate_id values (), (), (), (), (), (), (), (), (), ()") 833 tk.MustQuery("select a from truncate_id where a > 11").Check(testkit.Rows()) 834 } 835 836 func (s *testStochastikSuite) TestString(c *C) { 837 tk := testkit.NewTestKitWithInit(c, s.causetstore) 838 tk.MustInterDirc("select 1") 839 // here to check the panic bug in String() when txn is nil after committed. 840 c.Log(tk.Se.String()) 841 } 842 843 func (s *testStochastikSuite) TestDatabase(c *C) { 844 tk := testkit.NewTestKitWithInit(c, s.causetstore) 845 846 // Test database. 847 tk.MustInterDirc("create database xxx") 848 tk.MustInterDirc("drop database xxx") 849 850 tk.MustInterDirc("drop database if exists xxx") 851 tk.MustInterDirc("create database xxx") 852 tk.MustInterDirc("create database if not exists xxx") 853 tk.MustInterDirc("drop database if exists xxx") 854 855 // Test schemaReplicant. 856 tk.MustInterDirc("create schemaReplicant xxx") 857 tk.MustInterDirc("drop schemaReplicant xxx") 858 859 tk.MustInterDirc("drop schemaReplicant if exists xxx") 860 tk.MustInterDirc("create schemaReplicant xxx") 861 tk.MustInterDirc("create schemaReplicant if not exists xxx") 862 tk.MustInterDirc("drop schemaReplicant if exists xxx") 863 } 864 865 func (s *testStochastikSuite) TestInterDircRestrictedALLEGROSQL(c *C) { 866 tk := testkit.NewTestKitWithInit(c, s.causetstore) 867 r, _, err := tk.Se.(sqlexec.RestrictedALLEGROSQLInterlockingDirectorate).InterDircRestrictedALLEGROSQL("select 1;") 868 c.Assert(err, IsNil) 869 c.Assert(len(r), Equals, 1) 870 } 871 872 // TestInTrans . See https://dev.allegrosql.com/doc/internals/en/status-flags.html 873 func (s *testStochastikSuite) TestInTrans(c *C) { 874 tk := testkit.NewTestKitWithInit(c, s.causetstore) 875 tk.MustInterDirc("drop causet if exists t;") 876 tk.MustInterDirc("create causet t (id BIGINT PRIMARY KEY AUTO_INCREMENT NOT NULL)") 877 tk.MustInterDirc("insert t values ()") 878 tk.MustInterDirc("begin") 879 txn, err := tk.Se.Txn(true) 880 c.Assert(err, IsNil) 881 c.Assert(txn.Valid(), IsTrue) 882 tk.MustInterDirc("insert t values ()") 883 c.Assert(txn.Valid(), IsTrue) 884 tk.MustInterDirc("drop causet if exists t;") 885 c.Assert(txn.Valid(), IsFalse) 886 tk.MustInterDirc("create causet t (id BIGINT PRIMARY KEY AUTO_INCREMENT NOT NULL)") 887 c.Assert(txn.Valid(), IsFalse) 888 tk.MustInterDirc("insert t values ()") 889 c.Assert(txn.Valid(), IsFalse) 890 tk.MustInterDirc("commit") 891 tk.MustInterDirc("insert t values ()") 892 893 tk.MustInterDirc("set autocommit=0") 894 tk.MustInterDirc("begin") 895 c.Assert(txn.Valid(), IsTrue) 896 tk.MustInterDirc("insert t values ()") 897 c.Assert(txn.Valid(), IsTrue) 898 tk.MustInterDirc("commit") 899 c.Assert(txn.Valid(), IsFalse) 900 tk.MustInterDirc("insert t values ()") 901 c.Assert(txn.Valid(), IsTrue) 902 tk.MustInterDirc("commit") 903 c.Assert(txn.Valid(), IsFalse) 904 905 tk.MustInterDirc("set autocommit=1") 906 tk.MustInterDirc("drop causet if exists t") 907 tk.MustInterDirc("create causet t (id BIGINT PRIMARY KEY AUTO_INCREMENT NOT NULL)") 908 tk.MustInterDirc("begin") 909 c.Assert(txn.Valid(), IsTrue) 910 tk.MustInterDirc("insert t values ()") 911 c.Assert(txn.Valid(), IsTrue) 912 tk.MustInterDirc("rollback") 913 c.Assert(txn.Valid(), IsFalse) 914 } 915 916 func (s *testStochastikSuite) TestRetryPreparedStmt(c *C) { 917 tk := testkit.NewTestKitWithInit(c, s.causetstore) 918 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 919 tk2 := testkit.NewTestKitWithInit(c, s.causetstore) 920 921 tk.MustInterDirc("drop causet if exists t") 922 txn, err := tk.Se.Txn(true) 923 c.Assert(ekv.ErrInvalidTxn.Equal(err), IsTrue) 924 c.Assert(txn.Valid(), IsFalse) 925 tk.MustInterDirc("create causet t (c1 int, c2 int, c3 int)") 926 tk.MustInterDirc("insert t values (11, 2, 3)") 927 928 tk1.MustInterDirc("set @@milevadb_disable_txn_auto_retry = 0") 929 tk1.MustInterDirc("begin") 930 tk1.MustInterDirc("uFIDelate t set c2=? where c1=11;", 21) 931 932 tk2.MustInterDirc("begin") 933 tk2.MustInterDirc("uFIDelate t set c2=? where c1=11", 22) 934 tk2.MustInterDirc("commit") 935 936 tk1.MustInterDirc("commit") 937 938 tk.MustQuery("select c2 from t where c1=11").Check(testkit.Rows("21")) 939 } 940 941 func (s *testStochastikSuite) TestStochastik(c *C) { 942 tk := testkit.NewTestKitWithInit(c, s.causetstore) 943 tk.MustInterDirc("ROLLBACK;") 944 tk.Se.Close() 945 } 946 947 func (s *testStochastikSuite) TestStochastikAuth(c *C) { 948 tk := testkit.NewTestKitWithInit(c, s.causetstore) 949 c.Assert(tk.Se.Auth(&auth.UserIdentity{Username: "Any not exist username with zero password!", Hostname: "anyhost"}, []byte(""), []byte("")), IsFalse) 950 } 951 952 func (s *testStochastikSerialSuite) TestSkipWithGrant(c *C) { 953 tk := testkit.NewTestKitWithInit(c, s.causetstore) 954 save2 := privileges.SkipWithGrant 955 956 privileges.SkipWithGrant = false 957 c.Assert(tk.Se.Auth(&auth.UserIdentity{Username: "user_not_exist"}, []byte("yyy"), []byte("zzz")), IsFalse) 958 959 privileges.SkipWithGrant = true 960 c.Assert(tk.Se.Auth(&auth.UserIdentity{Username: "xxx", Hostname: `%`}, []byte("yyy"), []byte("zzz")), IsTrue) 961 c.Assert(tk.Se.Auth(&auth.UserIdentity{Username: "root", Hostname: `%`}, []byte(""), []byte("")), IsTrue) 962 tk.MustInterDirc("create causet t (id int)") 963 tk.MustInterDirc("create role r_1") 964 tk.MustInterDirc("grant r_1 to root") 965 tk.MustInterDirc("set role all") 966 tk.MustInterDirc("show grants for root") 967 privileges.SkipWithGrant = save2 968 } 969 970 func (s *testStochastikSuite) TestLastInsertID(c *C) { 971 tk := testkit.NewTestKitWithInit(c, s.causetstore) 972 // insert 973 tk.MustInterDirc("create causet t (c1 int not null auto_increment, c2 int, PRIMARY KEY (c1))") 974 tk.MustInterDirc("insert into t set c2 = 11") 975 tk.MustQuery("select last_insert_id()").Check(testkit.Rows("1")) 976 977 tk.MustInterDirc("insert into t (c2) values (22), (33), (44)") 978 tk.MustQuery("select last_insert_id()").Check(testkit.Rows("2")) 979 980 tk.MustInterDirc("insert into t (c1, c2) values (10, 55)") 981 tk.MustQuery("select last_insert_id()").Check(testkit.Rows("2")) 982 983 // replace 984 tk.MustInterDirc("replace t (c2) values(66)") 985 tk.MustQuery("select * from t").Check(testkit.Rows("1 11", "2 22", "3 33", "4 44", "10 55", "11 66")) 986 tk.MustQuery("select last_insert_id()").Check(testkit.Rows("11")) 987 988 // uFIDelate 989 tk.MustInterDirc("uFIDelate t set c1=last_insert_id(c1 + 100)") 990 tk.MustQuery("select * from t").Check(testkit.Rows("101 11", "102 22", "103 33", "104 44", "110 55", "111 66")) 991 tk.MustQuery("select last_insert_id()").Check(testkit.Rows("111")) 992 tk.MustInterDirc("insert into t (c2) values (77)") 993 tk.MustQuery("select last_insert_id()").Check(testkit.Rows("112")) 994 995 // drop 996 tk.MustInterDirc("drop causet t") 997 tk.MustQuery("select last_insert_id()").Check(testkit.Rows("112")) 998 999 tk.MustInterDirc("create causet t (c2 int, c3 int, c1 int not null auto_increment, PRIMARY KEY (c1))") 1000 tk.MustInterDirc("insert into t set c2 = 30") 1001 1002 // insert values 1003 lastInsertID := tk.Se.LastInsertID() 1004 tk.MustInterDirc("prepare stmt1 from 'insert into t (c2) values (?)'") 1005 tk.MustInterDirc("set @v1=10") 1006 tk.MustInterDirc("set @v2=20") 1007 tk.MustInterDirc("execute stmt1 using @v1") 1008 tk.MustInterDirc("execute stmt1 using @v2") 1009 tk.MustInterDirc("deallocate prepare stmt1") 1010 currLastInsertID := tk.Se.GetStochastikVars().StmtCtx.PrevLastInsertID 1011 tk.MustQuery("select c1 from t where c2 = 20").Check(testkit.Rows(fmt.Sprint(currLastInsertID))) 1012 c.Assert(lastInsertID+2, Equals, currLastInsertID) 1013 } 1014 1015 func (s *testStochastikSuite) TestPrepareZero(c *C) { 1016 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1017 tk.MustInterDirc("drop causet if exists t") 1018 tk.MustInterDirc("create causet t(v timestamp)") 1019 tk.MustInterDirc("prepare s1 from 'insert into t (v) values (?)'") 1020 tk.MustInterDirc("set @v1='0'") 1021 _, rs := tk.InterDirc("execute s1 using @v1") 1022 c.Assert(rs, NotNil) 1023 tk.MustInterDirc("set @v2='" + types.ZeroDatetimeStr + "'") 1024 tk.MustInterDirc("execute s1 using @v2") 1025 tk.MustQuery("select v from t").Check(testkit.Rows("0000-00-00 00:00:00")) 1026 } 1027 1028 func (s *testStochastikSuite) TestPrimaryKeyAutoIncrement(c *C) { 1029 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1030 tk.MustInterDirc("drop causet if exists t") 1031 tk.MustInterDirc("create causet t (id BIGINT PRIMARY KEY AUTO_INCREMENT NOT NULL, name varchar(255) UNIQUE NOT NULL, status int)") 1032 tk.MustInterDirc("insert t (name) values (?)", "abc") 1033 id := tk.Se.LastInsertID() 1034 c.Check(id != 0, IsTrue) 1035 1036 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 1037 tk1.MustQuery("select * from t").Check(testkit.Rows(fmt.Sprintf("%d abc <nil>", id))) 1038 1039 tk.MustInterDirc("uFIDelate t set name = 'abc', status = 1 where id = ?", id) 1040 tk1.MustQuery("select * from t").Check(testkit.Rows(fmt.Sprintf("%d abc 1", id))) 1041 1042 // Check for pass bool param to milevadb prepared memex 1043 tk.MustInterDirc("drop causet if exists t") 1044 tk.MustInterDirc("create causet t (id tinyint)") 1045 tk.MustInterDirc("insert t values (?)", true) 1046 tk.MustQuery("select * from t").Check(testkit.Rows("1")) 1047 } 1048 1049 func (s *testStochastikSuite) TestAutoIncrementID(c *C) { 1050 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1051 tk.MustInterDirc("drop causet if exists t") 1052 tk.MustInterDirc("create causet t (id BIGINT PRIMARY KEY AUTO_INCREMENT NOT NULL)") 1053 tk.MustInterDirc("insert t values ()") 1054 tk.MustInterDirc("insert t values ()") 1055 tk.MustInterDirc("insert t values ()") 1056 tk.MustInterDirc("drop causet if exists t;") 1057 tk.MustInterDirc("create causet t (id BIGINT PRIMARY KEY AUTO_INCREMENT NOT NULL)") 1058 tk.MustInterDirc("insert t values ()") 1059 lastID := tk.Se.LastInsertID() 1060 c.Assert(lastID, Less, uint64(4)) 1061 tk.MustInterDirc("insert t () values ()") 1062 c.Assert(tk.Se.LastInsertID(), Greater, lastID) 1063 lastID = tk.Se.LastInsertID() 1064 tk.MustInterDirc("insert t values (100)") 1065 c.Assert(tk.Se.LastInsertID(), Equals, uint64(100)) 1066 1067 // If the auto_increment column value is given, it uses the value of the latest event. 1068 tk.MustInterDirc("insert t values (120), (112)") 1069 c.Assert(tk.Se.LastInsertID(), Equals, uint64(112)) 1070 1071 // The last_insert_id function only use last auto-generated id. 1072 tk.MustQuery("select last_insert_id()").Check(testkit.Rows(fmt.Sprint(lastID))) 1073 1074 tk.MustInterDirc("drop causet if exists t") 1075 tk.MustInterDirc("create causet t (i tinyint unsigned not null auto_increment, primary key (i));") 1076 tk.MustInterDirc("insert into t set i = 254;") 1077 tk.MustInterDirc("insert t values ()") 1078 1079 // The last insert ID doesn't care about primary key, it is set even if its a normal index column. 1080 tk.MustInterDirc("create causet autoid (id int auto_increment, index (id))") 1081 tk.MustInterDirc("insert autoid values ()") 1082 c.Assert(tk.Se.LastInsertID(), Greater, uint64(0)) 1083 tk.MustInterDirc("insert autoid values (100)") 1084 c.Assert(tk.Se.LastInsertID(), Equals, uint64(100)) 1085 1086 tk.MustQuery("select last_insert_id(20)").Check(testkit.Rows(fmt.Sprint(20))) 1087 tk.MustQuery("select last_insert_id()").Check(testkit.Rows(fmt.Sprint(20))) 1088 1089 // Corner cases for unsigned bigint auto_increment DeferredCausets. 1090 tk.MustInterDirc("drop causet if exists autoid") 1091 tk.MustInterDirc("create causet autoid(`auto_inc_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,UNIQUE KEY `auto_inc_id` (`auto_inc_id`))") 1092 tk.MustInterDirc("insert into autoid values(9223372036854775808);") 1093 tk.MustInterDirc("insert into autoid values();") 1094 tk.MustInterDirc("insert into autoid values();") 1095 tk.MustQuery("select * from autoid").Check(testkit.Rows("9223372036854775808", "9223372036854775810", "9223372036854775812")) 1096 // In MilevaDB : _milevadb_rowid will also consume the autoID when the auto_increment column is not the primary key. 1097 // Using the MaxUint64 and MaxInt64 as the autoID upper limit like MyALLEGROSQL will cause _milevadb_rowid allocation fail here. 1098 _, err := tk.InterDirc("insert into autoid values(18446744073709551614)") 1099 c.Assert(terror.ErrorEqual(err, autoid.ErrAutoincReadFailed), IsTrue) 1100 _, err = tk.InterDirc("insert into autoid values()") 1101 c.Assert(terror.ErrorEqual(err, autoid.ErrAutoincReadFailed), IsTrue) 1102 // FixMe: MyALLEGROSQL works fine with the this allegrosql. 1103 _, err = tk.InterDirc("insert into autoid values(18446744073709551615)") 1104 c.Assert(terror.ErrorEqual(err, autoid.ErrAutoincReadFailed), IsTrue) 1105 1106 tk.MustInterDirc("drop causet if exists autoid") 1107 tk.MustInterDirc("create causet autoid(`auto_inc_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,UNIQUE KEY `auto_inc_id` (`auto_inc_id`))") 1108 tk.MustInterDirc("insert into autoid values()") 1109 tk.MustQuery("select * from autoid").Check(testkit.Rows("1")) 1110 tk.MustInterDirc("insert into autoid values(5000)") 1111 tk.MustQuery("select * from autoid").Check(testkit.Rows("1", "5000")) 1112 _, err = tk.InterDirc("uFIDelate autoid set auto_inc_id = 8000") 1113 c.Assert(terror.ErrorEqual(err, ekv.ErrKeyExists), IsTrue) 1114 tk.MustQuery("select * from autoid use index()").Check(testkit.Rows("1", "5000")) 1115 tk.MustInterDirc("uFIDelate autoid set auto_inc_id = 9000 where auto_inc_id=1") 1116 tk.MustQuery("select * from autoid use index()").Check(testkit.Rows("9000", "5000")) 1117 tk.MustInterDirc("insert into autoid values()") 1118 tk.MustQuery("select * from autoid use index()").Check(testkit.Rows("9000", "5000", "9001")) 1119 1120 // Corner cases for signed bigint auto_increment DeferredCausets. 1121 tk.MustInterDirc("drop causet if exists autoid") 1122 tk.MustInterDirc("create causet autoid(`auto_inc_id` bigint(20) NOT NULL AUTO_INCREMENT,UNIQUE KEY `auto_inc_id` (`auto_inc_id`))") 1123 // In MilevaDB : _milevadb_rowid will also consume the autoID when the auto_increment column is not the primary key. 1124 // Using the MaxUint64 and MaxInt64 as autoID upper limit like MyALLEGROSQL will cause insert fail if the values is 1125 // 9223372036854775806. Because _milevadb_rowid will be allocated 9223372036854775807 at same time. 1126 tk.MustInterDirc("insert into autoid values(9223372036854775805);") 1127 tk.MustQuery("select auto_inc_id, _milevadb_rowid from autoid use index()").Check(testkit.Rows("9223372036854775805 9223372036854775806")) 1128 _, err = tk.InterDirc("insert into autoid values();") 1129 c.Assert(terror.ErrorEqual(err, autoid.ErrAutoincReadFailed), IsTrue) 1130 tk.MustQuery("select auto_inc_id, _milevadb_rowid from autoid use index()").Check(testkit.Rows("9223372036854775805 9223372036854775806")) 1131 tk.MustQuery("select auto_inc_id, _milevadb_rowid from autoid use index(auto_inc_id)").Check(testkit.Rows("9223372036854775805 9223372036854775806")) 1132 1133 tk.MustInterDirc("drop causet if exists autoid") 1134 tk.MustInterDirc("create causet autoid(`auto_inc_id` bigint(20) NOT NULL AUTO_INCREMENT,UNIQUE KEY `auto_inc_id` (`auto_inc_id`))") 1135 tk.MustInterDirc("insert into autoid values()") 1136 tk.MustQuery("select * from autoid use index()").Check(testkit.Rows("1")) 1137 tk.MustInterDirc("insert into autoid values(5000)") 1138 tk.MustQuery("select * from autoid use index()").Check(testkit.Rows("1", "5000")) 1139 _, err = tk.InterDirc("uFIDelate autoid set auto_inc_id = 8000") 1140 c.Assert(terror.ErrorEqual(err, ekv.ErrKeyExists), IsTrue) 1141 tk.MustQuery("select * from autoid use index()").Check(testkit.Rows("1", "5000")) 1142 tk.MustInterDirc("uFIDelate autoid set auto_inc_id = 9000 where auto_inc_id=1") 1143 tk.MustQuery("select * from autoid use index()").Check(testkit.Rows("9000", "5000")) 1144 tk.MustInterDirc("insert into autoid values()") 1145 tk.MustQuery("select * from autoid use index()").Check(testkit.Rows("9000", "5000", "9001")) 1146 } 1147 1148 func (s *testStochastikSuite) TestAutoIncrementWithRetry(c *C) { 1149 // test for https://github.com/whtcorpsinc/milevadb/issues/827 1150 1151 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1152 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 1153 1154 tk.MustInterDirc("set @@milevadb_disable_txn_auto_retry = 0") 1155 tk.MustInterDirc("create causet t (c2 int, c1 int not null auto_increment, PRIMARY KEY (c1))") 1156 tk.MustInterDirc("insert into t (c2) values (1), (2), (3), (4), (5)") 1157 1158 // insert values 1159 lastInsertID := tk.Se.LastInsertID() 1160 tk.MustInterDirc("begin") 1161 tk.MustInterDirc("insert into t (c2) values (11), (12), (13)") 1162 tk.MustQuery("select c1 from t where c2 = 11").Check(testkit.Rows("6")) 1163 tk.MustInterDirc("uFIDelate t set c2 = 33 where c2 = 1") 1164 1165 tk1.MustInterDirc("uFIDelate t set c2 = 22 where c2 = 1") 1166 1167 tk.MustInterDirc("commit") 1168 1169 tk.MustQuery("select c1 from t where c2 = 11").Check(testkit.Rows("6")) 1170 currLastInsertID := tk.Se.GetStochastikVars().StmtCtx.PrevLastInsertID 1171 c.Assert(lastInsertID+5, Equals, currLastInsertID) 1172 1173 // insert set 1174 lastInsertID = currLastInsertID 1175 tk.MustInterDirc("begin") 1176 tk.MustInterDirc("insert into t set c2 = 31") 1177 tk.MustQuery("select c1 from t where c2 = 31").Check(testkit.Rows("9")) 1178 tk.MustInterDirc("uFIDelate t set c2 = 44 where c2 = 2") 1179 1180 tk1.MustInterDirc("uFIDelate t set c2 = 55 where c2 = 2") 1181 1182 tk.MustInterDirc("commit") 1183 1184 tk.MustQuery("select c1 from t where c2 = 31").Check(testkit.Rows("9")) 1185 currLastInsertID = tk.Se.GetStochastikVars().StmtCtx.PrevLastInsertID 1186 c.Assert(lastInsertID+3, Equals, currLastInsertID) 1187 1188 // replace 1189 lastInsertID = currLastInsertID 1190 tk.MustInterDirc("begin") 1191 tk.MustInterDirc("insert into t (c2) values (21), (22), (23)") 1192 tk.MustQuery("select c1 from t where c2 = 21").Check(testkit.Rows("10")) 1193 tk.MustInterDirc("uFIDelate t set c2 = 66 where c2 = 3") 1194 1195 tk1.MustInterDirc("uFIDelate t set c2 = 77 where c2 = 3") 1196 1197 tk.MustInterDirc("commit") 1198 1199 tk.MustQuery("select c1 from t where c2 = 21").Check(testkit.Rows("10")) 1200 currLastInsertID = tk.Se.GetStochastikVars().StmtCtx.PrevLastInsertID 1201 c.Assert(lastInsertID+1, Equals, currLastInsertID) 1202 1203 // uFIDelate 1204 lastInsertID = currLastInsertID 1205 tk.MustInterDirc("begin") 1206 tk.MustInterDirc("insert into t set c2 = 41") 1207 tk.MustInterDirc("uFIDelate t set c1 = 0 where c2 = 41") 1208 tk.MustQuery("select c1 from t where c2 = 41").Check(testkit.Rows("0")) 1209 tk.MustInterDirc("uFIDelate t set c2 = 88 where c2 = 4") 1210 1211 tk1.MustInterDirc("uFIDelate t set c2 = 99 where c2 = 4") 1212 1213 tk.MustInterDirc("commit") 1214 1215 tk.MustQuery("select c1 from t where c2 = 41").Check(testkit.Rows("0")) 1216 currLastInsertID = tk.Se.GetStochastikVars().StmtCtx.PrevLastInsertID 1217 c.Assert(lastInsertID+3, Equals, currLastInsertID) 1218 1219 // prepare 1220 lastInsertID = currLastInsertID 1221 tk.MustInterDirc("begin") 1222 tk.MustInterDirc("prepare stmt from 'insert into t (c2) values (?)'") 1223 tk.MustInterDirc("set @v1=100") 1224 tk.MustInterDirc("set @v2=200") 1225 tk.MustInterDirc("set @v3=300") 1226 tk.MustInterDirc("execute stmt using @v1") 1227 tk.MustInterDirc("execute stmt using @v2") 1228 tk.MustInterDirc("execute stmt using @v3") 1229 tk.MustInterDirc("deallocate prepare stmt") 1230 tk.MustQuery("select c1 from t where c2 = 12").Check(testkit.Rows("7")) 1231 tk.MustInterDirc("uFIDelate t set c2 = 111 where c2 = 5") 1232 1233 tk1.MustInterDirc("uFIDelate t set c2 = 222 where c2 = 5") 1234 1235 tk.MustInterDirc("commit") 1236 1237 tk.MustQuery("select c1 from t where c2 = 12").Check(testkit.Rows("7")) 1238 currLastInsertID = tk.Se.GetStochastikVars().StmtCtx.PrevLastInsertID 1239 c.Assert(lastInsertID+3, Equals, currLastInsertID) 1240 } 1241 1242 func (s *testStochastikSuite) TestBinaryReadOnly(c *C) { 1243 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1244 tk.MustInterDirc("create causet t (i int key)") 1245 id, _, _, err := tk.Se.PrepareStmt("select i from t where i = ?") 1246 c.Assert(err, IsNil) 1247 id2, _, _, err := tk.Se.PrepareStmt("insert into t values (?)") 1248 c.Assert(err, IsNil) 1249 tk.MustInterDirc("set autocommit = 0") 1250 tk.MustInterDirc("set milevadb_disable_txn_auto_retry = 0") 1251 _, err = tk.Se.InterDircutePreparedStmt(context.Background(), id, []types.Causet{types.NewCauset(1)}) 1252 c.Assert(err, IsNil) 1253 c.Assert(stochastik.GetHistory(tk.Se).Count(), Equals, 0) 1254 tk.MustInterDirc("insert into t values (1)") 1255 c.Assert(stochastik.GetHistory(tk.Se).Count(), Equals, 1) 1256 _, err = tk.Se.InterDircutePreparedStmt(context.Background(), id2, []types.Causet{types.NewCauset(2)}) 1257 c.Assert(err, IsNil) 1258 c.Assert(stochastik.GetHistory(tk.Se).Count(), Equals, 2) 1259 tk.MustInterDirc("commit") 1260 } 1261 1262 func (s *testStochastikSuite) TestPrepare(c *C) { 1263 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1264 tk.MustInterDirc("create causet t(id TEXT)") 1265 tk.MustInterDirc(`INSERT INTO t VALUES ("id");`) 1266 id, ps, _, err := tk.Se.PrepareStmt("select id+? from t") 1267 ctx := context.Background() 1268 c.Assert(err, IsNil) 1269 c.Assert(id, Equals, uint32(1)) 1270 c.Assert(ps, Equals, 1) 1271 tk.MustInterDirc(`set @a=1`) 1272 _, err = tk.Se.InterDircutePreparedStmt(ctx, id, []types.Causet{types.NewCauset("1")}) 1273 c.Assert(err, IsNil) 1274 err = tk.Se.DropPreparedStmt(id) 1275 c.Assert(err, IsNil) 1276 1277 tk.MustInterDirc("prepare stmt from 'select 1+?'") 1278 tk.MustInterDirc("set @v1=100") 1279 tk.MustQuery("execute stmt using @v1").Check(testkit.Rows("101")) 1280 1281 tk.MustInterDirc("set @v2=200") 1282 tk.MustQuery("execute stmt using @v2").Check(testkit.Rows("201")) 1283 1284 tk.MustInterDirc("set @v3=300") 1285 tk.MustQuery("execute stmt using @v3").Check(testkit.Rows("301")) 1286 tk.MustInterDirc("deallocate prepare stmt") 1287 1288 // InterDircute prepared memexs for more than one time. 1289 tk.MustInterDirc("create causet multiexec (a int, b int)") 1290 tk.MustInterDirc("insert multiexec values (1, 1), (2, 2)") 1291 id, _, _, err = tk.Se.PrepareStmt("select a from multiexec where b = ? order by b") 1292 c.Assert(err, IsNil) 1293 rs, err := tk.Se.InterDircutePreparedStmt(ctx, id, []types.Causet{types.NewCauset(1)}) 1294 c.Assert(err, IsNil) 1295 rs.Close() 1296 rs, err = tk.Se.InterDircutePreparedStmt(ctx, id, []types.Causet{types.NewCauset(2)}) 1297 rs.Close() 1298 c.Assert(err, IsNil) 1299 } 1300 1301 func (s *testStochastikSuite2) TestSpecifyIndexPrefixLength(c *C) { 1302 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1303 1304 _, err := tk.InterDirc("create causet t (c1 char, index(c1(3)));") 1305 // ERROR 1089 (HY000): Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique prefix keys 1306 c.Assert(err, NotNil) 1307 1308 _, err = tk.InterDirc("create causet t (c1 int, index(c1(3)));") 1309 // ERROR 1089 (HY000): Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique prefix keys 1310 c.Assert(err, NotNil) 1311 1312 _, err = tk.InterDirc("create causet t (c1 bit(10), index(c1(3)));") 1313 // ERROR 1089 (HY000): Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique prefix keys 1314 c.Assert(err, NotNil) 1315 1316 tk.MustInterDirc("create causet t (c1 char, c2 int, c3 bit(10));") 1317 1318 _, err = tk.InterDirc("create index idx_c1 on t (c1(3));") 1319 // ERROR 1089 (HY000): Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique prefix keys 1320 c.Assert(err, NotNil) 1321 1322 _, err = tk.InterDirc("create index idx_c1 on t (c2(3));") 1323 // ERROR 1089 (HY000): Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique prefix keys 1324 c.Assert(err, NotNil) 1325 1326 _, err = tk.InterDirc("create index idx_c1 on t (c3(3));") 1327 // ERROR 1089 (HY000): Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique prefix keys 1328 c.Assert(err, NotNil) 1329 1330 tk.MustInterDirc("drop causet if exists t;") 1331 1332 _, err = tk.InterDirc("create causet t (c1 int, c2 blob, c3 varchar(64), index(c2));") 1333 // ERROR 1170 (42000): BLOB/TEXT column 'c2' used in key specification without a key length 1334 c.Assert(err, NotNil) 1335 1336 tk.MustInterDirc("create causet t (c1 int, c2 blob, c3 varchar(64));") 1337 _, err = tk.InterDirc("create index idx_c1 on t (c2);") 1338 // ERROR 1170 (42000): BLOB/TEXT column 'c2' used in key specification without a key length 1339 c.Assert(err, NotNil) 1340 1341 _, err = tk.InterDirc("create index idx_c1 on t (c2(555555));") 1342 // ERROR 1071 (42000): Specified key was too long; max key length is 3072 bytes 1343 c.Assert(err, NotNil) 1344 1345 _, err = tk.InterDirc("create index idx_c1 on t (c1(5))") 1346 // ERROR 1089 (HY000): Incorrect prefix key; 1347 // the used key part isn't a string, the used length is longer than the key part, 1348 // or the storage engine doesn't support unique prefix keys 1349 c.Assert(err, NotNil) 1350 1351 tk.MustInterDirc("create index idx_c1 on t (c1);") 1352 tk.MustInterDirc("create index idx_c2 on t (c2(3));") 1353 tk.MustInterDirc("create unique index idx_c3 on t (c3(5));") 1354 1355 tk.MustInterDirc("insert into t values (3, 'abc', 'def');") 1356 tk.MustQuery("select c2 from t where c2 = 'abc';").Check(testkit.Rows("abc")) 1357 1358 tk.MustInterDirc("insert into t values (4, 'abcd', 'xxx');") 1359 tk.MustInterDirc("insert into t values (4, 'abcf', 'yyy');") 1360 tk.MustQuery("select c2 from t where c2 = 'abcf';").Check(testkit.Rows("abcf")) 1361 tk.MustQuery("select c2 from t where c2 = 'abcd';").Check(testkit.Rows("abcd")) 1362 1363 tk.MustInterDirc("insert into t values (4, 'ignore', 'abcdeXXX');") 1364 _, err = tk.InterDirc("insert into t values (5, 'ignore', 'abcdeYYY');") 1365 // ERROR 1062 (23000): Duplicate entry 'abcde' for key 'idx_c3' 1366 c.Assert(err, NotNil) 1367 tk.MustQuery("select c3 from t where c3 = 'abcde';").Check(testkit.Rows()) 1368 1369 tk.MustInterDirc("delete from t where c3 = 'abcdeXXX';") 1370 tk.MustInterDirc("delete from t where c2 = 'abc';") 1371 1372 tk.MustQuery("select c2 from t where c2 > 'abcd';").Check(testkit.Rows("abcf")) 1373 tk.MustQuery("select c2 from t where c2 < 'abcf';").Check(testkit.Rows("abcd")) 1374 tk.MustQuery("select c2 from t where c2 >= 'abcd';").Check(testkit.Rows("abcd", "abcf")) 1375 tk.MustQuery("select c2 from t where c2 <= 'abcf';").Check(testkit.Rows("abcd", "abcf")) 1376 tk.MustQuery("select c2 from t where c2 != 'abc';").Check(testkit.Rows("abcd", "abcf")) 1377 tk.MustQuery("select c2 from t where c2 != 'abcd';").Check(testkit.Rows("abcf")) 1378 1379 tk.MustInterDirc("drop causet if exists t1;") 1380 tk.MustInterDirc("create causet t1 (a int, b char(255), key(a, b(20)));") 1381 tk.MustInterDirc("insert into t1 values (0, '1');") 1382 tk.MustInterDirc("uFIDelate t1 set b = b + 1 where a = 0;") 1383 tk.MustQuery("select b from t1 where a = 0;").Check(testkit.Rows("2")) 1384 1385 // test union index. 1386 tk.MustInterDirc("drop causet if exists t;") 1387 tk.MustInterDirc("create causet t (a text, b text, c int, index (a(3), b(3), c));") 1388 tk.MustInterDirc("insert into t values ('abc', 'abcd', 1);") 1389 tk.MustInterDirc("insert into t values ('abcx', 'abcf', 2);") 1390 tk.MustInterDirc("insert into t values ('abcy', 'abcf', 3);") 1391 tk.MustInterDirc("insert into t values ('bbc', 'abcd', 4);") 1392 tk.MustInterDirc("insert into t values ('bbcz', 'abcd', 5);") 1393 tk.MustInterDirc("insert into t values ('cbck', 'abd', 6);") 1394 tk.MustQuery("select c from t where a = 'abc' and b <= 'abc';").Check(testkit.Rows()) 1395 tk.MustQuery("select c from t where a = 'abc' and b <= 'abd';").Check(testkit.Rows("1")) 1396 tk.MustQuery("select c from t where a < 'cbc' and b > 'abcd';").Check(testkit.Rows("2", "3")) 1397 tk.MustQuery("select c from t where a <= 'abd' and b > 'abc';").Check(testkit.Rows("1", "2", "3")) 1398 tk.MustQuery("select c from t where a < 'bbcc' and b = 'abcd';").Check(testkit.Rows("1", "4")) 1399 tk.MustQuery("select c from t where a > 'bbcf';").Check(testkit.Rows("5", "6")) 1400 } 1401 1402 func (s *testStochastikSuite) TestResultField(c *C) { 1403 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1404 tk.MustInterDirc("create causet t (id int);") 1405 1406 tk.MustInterDirc(`INSERT INTO t VALUES (1);`) 1407 tk.MustInterDirc(`INSERT INTO t VALUES (2);`) 1408 r, err := tk.InterDirc(`SELECT count(*) from t;`) 1409 c.Assert(err, IsNil) 1410 fields := r.Fields() 1411 c.Assert(err, IsNil) 1412 c.Assert(len(fields), Equals, 1) 1413 field := fields[0].DeferredCauset 1414 c.Assert(field.Tp, Equals, allegrosql.TypeLonglong) 1415 c.Assert(field.Flen, Equals, 21) 1416 } 1417 1418 func (s *testStochastikSuite) TestResultType(c *C) { 1419 // Testcase for https://github.com/whtcorpsinc/milevadb/issues/325 1420 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1421 rs, err := tk.InterDirc(`select cast(null as char(30))`) 1422 c.Assert(err, IsNil) 1423 req := rs.NewChunk() 1424 err = rs.Next(context.Background(), req) 1425 c.Assert(err, IsNil) 1426 c.Assert(req.GetRow(0).IsNull(0), IsTrue) 1427 c.Assert(rs.Fields()[0].DeferredCauset.FieldType.Tp, Equals, allegrosql.TypeVarString) 1428 } 1429 1430 func (s *testStochastikSuite) TestFieldText(c *C) { 1431 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1432 tk.MustInterDirc("create causet t (a int)") 1433 tests := []struct { 1434 allegrosql string 1435 field string 1436 }{ 1437 {"select distinct(a) from t", "a"}, 1438 {"select (1)", "1"}, 1439 {"select (1+1)", "(1+1)"}, 1440 {"select a from t", "a"}, 1441 {"select ((a+1)) from t", "((a+1))"}, 1442 {"select 1 /*!32301 +1 */;", "1 +1 "}, 1443 {"select /*!32301 1 +1 */;", "1 +1 "}, 1444 {"/*!32301 select 1 +1 */;", "1 +1 "}, 1445 {"select 1 + /*!32301 1 +1 */;", "1 + 1 +1 "}, 1446 {"select 1 /*!32301 + 1, 1 */;", "1 + 1"}, 1447 {"select /*!32301 1, 1 +1 */;", "1"}, 1448 {"select /*!32301 1 + 1, */ +1;", "1 + 1"}, 1449 } 1450 for _, tt := range tests { 1451 result, err := tk.InterDirc(tt.allegrosql) 1452 c.Assert(err, IsNil) 1453 c.Assert(result.Fields()[0].DeferredCausetAsName.O, Equals, tt.field) 1454 } 1455 } 1456 1457 func (s *testStochastikSuite3) TestIndexMaxLength(c *C) { 1458 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1459 tk.MustInterDirc("create database test_index_max_length") 1460 tk.MustInterDirc("use test_index_max_length") 1461 1462 // create simple index at causet creation 1463 tk.MustGetErrCode("create causet t (c1 varchar(3073), index(c1)) charset = ascii;", allegrosql.ErrTooLongKey) 1464 1465 // create simple index after causet creation 1466 tk.MustInterDirc("create causet t (c1 varchar(3073)) charset = ascii;") 1467 tk.MustGetErrCode("create index idx_c1 on t(c1) ", allegrosql.ErrTooLongKey) 1468 tk.MustInterDirc("drop causet t;") 1469 1470 // create compound index at causet creation 1471 tk.MustGetErrCode("create causet t (c1 varchar(3072), c2 varchar(1), index(c1, c2)) charset = ascii;", allegrosql.ErrTooLongKey) 1472 tk.MustGetErrCode("create causet t (c1 varchar(3072), c2 char(1), index(c1, c2)) charset = ascii;", allegrosql.ErrTooLongKey) 1473 tk.MustGetErrCode("create causet t (c1 varchar(3072), c2 char, index(c1, c2)) charset = ascii;", allegrosql.ErrTooLongKey) 1474 tk.MustGetErrCode("create causet t (c1 varchar(3072), c2 date, index(c1, c2)) charset = ascii;", allegrosql.ErrTooLongKey) 1475 tk.MustGetErrCode("create causet t (c1 varchar(3069), c2 timestamp(1), index(c1, c2)) charset = ascii;", allegrosql.ErrTooLongKey) 1476 1477 tk.MustInterDirc("create causet t (c1 varchar(3068), c2 bit(26), index(c1, c2)) charset = ascii;") // 26 bit = 4 bytes 1478 tk.MustInterDirc("drop causet t;") 1479 tk.MustInterDirc("create causet t (c1 varchar(3068), c2 bit(32), index(c1, c2)) charset = ascii;") // 32 bit = 4 bytes 1480 tk.MustInterDirc("drop causet t;") 1481 tk.MustGetErrCode("create causet t (c1 varchar(3068), c2 bit(33), index(c1, c2)) charset = ascii;", allegrosql.ErrTooLongKey) 1482 1483 // create compound index after causet creation 1484 tk.MustInterDirc("create causet t (c1 varchar(3072), c2 varchar(1)) charset = ascii;") 1485 tk.MustGetErrCode("create index idx_c1_c2 on t(c1, c2);", allegrosql.ErrTooLongKey) 1486 tk.MustInterDirc("drop causet t;") 1487 1488 tk.MustInterDirc("create causet t (c1 varchar(3072), c2 char(1)) charset = ascii;") 1489 tk.MustGetErrCode("create index idx_c1_c2 on t(c1, c2);", allegrosql.ErrTooLongKey) 1490 tk.MustInterDirc("drop causet t;") 1491 1492 tk.MustInterDirc("create causet t (c1 varchar(3072), c2 char) charset = ascii;") 1493 tk.MustGetErrCode("create index idx_c1_c2 on t(c1, c2);", allegrosql.ErrTooLongKey) 1494 tk.MustInterDirc("drop causet t;") 1495 1496 tk.MustInterDirc("create causet t (c1 varchar(3072), c2 date) charset = ascii;") 1497 tk.MustGetErrCode("create index idx_c1_c2 on t(c1, c2);", allegrosql.ErrTooLongKey) 1498 tk.MustInterDirc("drop causet t;") 1499 1500 tk.MustInterDirc("create causet t (c1 varchar(3069), c2 timestamp(1)) charset = ascii;") 1501 tk.MustGetErrCode("create index idx_c1_c2 on t(c1, c2);", allegrosql.ErrTooLongKey) 1502 tk.MustInterDirc("drop causet t;") 1503 1504 // Test charsets other than `ascii`. 1505 assertCharsetLimit := func(charset string, bytesPerChar int) { 1506 base := 3072 / bytesPerChar 1507 tk.MustGetErrCode(fmt.Sprintf("create causet t (a varchar(%d) primary key) charset=%s", base+1, charset), allegrosql.ErrTooLongKey) 1508 tk.MustInterDirc(fmt.Sprintf("create causet t (a varchar(%d) primary key) charset=%s", base, charset)) 1509 tk.MustInterDirc("drop causet if exists t") 1510 } 1511 assertCharsetLimit("binary", 1) 1512 assertCharsetLimit("latin1", 1) 1513 assertCharsetLimit("utf8", 3) 1514 assertCharsetLimit("utf8mb4", 4) 1515 1516 // Test types bit length limit. 1517 assertTypeLimit := func(tp string, limitBitLength int) { 1518 base := 3072 - limitBitLength 1519 tk.MustGetErrCode(fmt.Sprintf("create causet t (a blob(10000), b %s, index idx(a(%d), b))", tp, base+1), allegrosql.ErrTooLongKey) 1520 tk.MustInterDirc(fmt.Sprintf("create causet t (a blob(10000), b %s, index idx(a(%d), b))", tp, base)) 1521 tk.MustInterDirc("drop causet if exists t") 1522 } 1523 1524 assertTypeLimit("tinyint", 1) 1525 assertTypeLimit("smallint", 2) 1526 assertTypeLimit("mediumint", 3) 1527 assertTypeLimit("int", 4) 1528 assertTypeLimit("integer", 4) 1529 assertTypeLimit("bigint", 8) 1530 assertTypeLimit("float", 4) 1531 assertTypeLimit("float(24)", 4) 1532 assertTypeLimit("float(25)", 8) 1533 assertTypeLimit("decimal(9)", 4) 1534 assertTypeLimit("decimal(10)", 5) 1535 assertTypeLimit("decimal(17)", 8) 1536 assertTypeLimit("year", 1) 1537 assertTypeLimit("date", 3) 1538 assertTypeLimit("time", 3) 1539 assertTypeLimit("datetime", 8) 1540 assertTypeLimit("timestamp", 4) 1541 } 1542 1543 func (s *testStochastikSuite2) TestIndexDeferredCausetLength(c *C) { 1544 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1545 tk.MustInterDirc("create causet t (c1 int, c2 blob);") 1546 tk.MustInterDirc("create index idx_c1 on t(c1);") 1547 tk.MustInterDirc("create index idx_c2 on t(c2(6));") 1548 1549 is := s.dom.SchemaReplicant() 1550 tab, err2 := is.TableByName(perceptron.NewCIStr("test"), perceptron.NewCIStr("t")) 1551 c.Assert(err2, Equals, nil) 1552 1553 idxC1DefCauss := blocks.FindIndexByDefCausName(tab, "c1").Meta().DeferredCausets 1554 c.Assert(idxC1DefCauss[0].Length, Equals, types.UnspecifiedLength) 1555 1556 idxC2DefCauss := blocks.FindIndexByDefCausName(tab, "c2").Meta().DeferredCausets 1557 c.Assert(idxC2DefCauss[0].Length, Equals, 6) 1558 } 1559 1560 func (s *testStochastikSuite2) TestIgnoreForeignKey(c *C) { 1561 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1562 sqlText := `CREATE TABLE address ( 1563 id bigint(20) NOT NULL AUTO_INCREMENT, 1564 user_id bigint(20) NOT NULL, 1565 PRIMARY KEY (id), 1566 CONSTRAINT FK_7rod8a71yep5vxasb0ms3osbg FOREIGN KEY (user_id) REFERENCES waimaiqa.user (id), 1567 INDEX FK_7rod8a71yep5vxasb0ms3osbg (user_id) comment '' 1568 ) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ROW_FORMAT=COMPACT COMMENT='' CHECKSUM=0 DELAY_KEY_WRITE=0;` 1569 tk.MustInterDirc(sqlText) 1570 } 1571 1572 // TestISDeferredCausets tests information_schema.columns. 1573 func (s *testStochastikSuite3) TestISDeferredCausets(c *C) { 1574 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1575 tk.MustInterDirc("select ORDINAL_POSITION from INFORMATION_SCHEMA.COLUMNS;") 1576 tk.MustQuery("SELECT CHARACTER_SET_NAME FROM INFORMATION_SCHEMA.CHARACTER_SETS WHERE CHARACTER_SET_NAME = 'utf8mb4'").Check(testkit.Rows("utf8mb4")) 1577 } 1578 1579 func (s *testStochastikSuite2) TestRetry(c *C) { 1580 // For https://github.com/whtcorpsinc/milevadb/issues/571 1581 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1582 1583 tk.MustInterDirc("begin") 1584 tk.MustInterDirc("drop causet if exists t") 1585 tk.MustInterDirc("create causet t (c int)") 1586 tk.MustInterDirc("insert t values (1), (2), (3)") 1587 tk.MustInterDirc("commit") 1588 1589 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 1590 tk2 := testkit.NewTestKitWithInit(c, s.causetstore) 1591 tk3 := testkit.NewTestKitWithInit(c, s.causetstore) 1592 tk3.MustInterDirc("SET SESSION autocommit=0;") 1593 tk1.MustInterDirc("set @@milevadb_disable_txn_auto_retry = 0") 1594 tk2.MustInterDirc("set @@milevadb_disable_txn_auto_retry = 0") 1595 tk3.MustInterDirc("set @@milevadb_disable_txn_auto_retry = 0") 1596 1597 var wg sync.WaitGroup 1598 wg.Add(3) 1599 f1 := func() { 1600 defer wg.Done() 1601 for i := 0; i < 30; i++ { 1602 tk1.MustInterDirc("uFIDelate t set c = 1;") 1603 } 1604 } 1605 f2 := func() { 1606 defer wg.Done() 1607 for i := 0; i < 30; i++ { 1608 tk2.MustInterDirc("uFIDelate t set c = ?;", 1) 1609 } 1610 } 1611 f3 := func() { 1612 defer wg.Done() 1613 for i := 0; i < 30; i++ { 1614 tk3.MustInterDirc("begin") 1615 tk3.MustInterDirc("uFIDelate t set c = 1;") 1616 tk3.MustInterDirc("commit") 1617 } 1618 } 1619 go f1() 1620 go f2() 1621 go f3() 1622 wg.Wait() 1623 } 1624 1625 func (s *testStochastikSuite3) TestMultiStmts(c *C) { 1626 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1627 tk.MustInterDirc("drop causet if exists t1; create causet t1(id int ); insert into t1 values (1);") 1628 tk.MustQuery("select * from t1;").Check(testkit.Rows("1")) 1629 } 1630 1631 func (s *testStochastikSuite2) TestLastInterDircuteDBSFlag(c *C) { 1632 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1633 tk.MustInterDirc("drop causet if exists t1") 1634 tk.MustInterDirc("create causet t1(id int)") 1635 c.Assert(tk.Se.Value(stochastikctx.LastInterDircuteDBS), NotNil) 1636 tk.MustInterDirc("insert into t1 values (1)") 1637 c.Assert(tk.Se.Value(stochastikctx.LastInterDircuteDBS), IsNil) 1638 } 1639 1640 func (s *testStochastikSuite3) TestDecimal(c *C) { 1641 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1642 1643 tk.MustInterDirc("drop causet if exists t;") 1644 tk.MustInterDirc("create causet t (a decimal unique);") 1645 tk.MustInterDirc("insert t values ('100');") 1646 _, err := tk.InterDirc("insert t values ('1e2');") 1647 c.Check(err, NotNil) 1648 } 1649 1650 func (s *testStochastikSuite2) TestBerolinaSQL(c *C) { 1651 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1652 1653 // test for https://github.com/whtcorpsinc/milevadb/pull/177 1654 tk.MustInterDirc("CREATE TABLE `t1` ( `a` char(3) NOT NULL default '', `b` char(3) NOT NULL default '', `c` char(3) NOT NULL default '', PRIMARY KEY (`a`,`b`,`c`)) ENGINE=InnoDB;") 1655 tk.MustInterDirc("CREATE TABLE `t2` ( `a` char(3) NOT NULL default '', `b` char(3) NOT NULL default '', `c` char(3) NOT NULL default '', PRIMARY KEY (`a`,`b`,`c`)) ENGINE=InnoDB;") 1656 tk.MustInterDirc(`INSERT INTO t1 VALUES (1,1,1);`) 1657 tk.MustInterDirc(`INSERT INTO t2 VALUES (1,1,1);`) 1658 tk.MustInterDirc(`PREPARE my_stmt FROM "SELECT t1.b, count(*) FROM t1 group by t1.b having count(*) > ALL (SELECT COUNT(*) FROM t2 WHERE t2.a=1 GROUP By t2.b)";`) 1659 tk.MustInterDirc(`EXECUTE my_stmt;`) 1660 tk.MustInterDirc(`EXECUTE my_stmt;`) 1661 tk.MustInterDirc(`deallocate prepare my_stmt;`) 1662 tk.MustInterDirc(`drop causet t1,t2;`) 1663 } 1664 1665 func (s *testStochastikSuite3) TestOnDuplicate(c *C) { 1666 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1667 1668 // test for https://github.com/whtcorpsinc/milevadb/pull/454 1669 tk.MustInterDirc("drop causet if exists t") 1670 tk.MustInterDirc("drop causet if exists t1") 1671 tk.MustInterDirc("create causet t1 (c1 int, c2 int, c3 int);") 1672 tk.MustInterDirc("insert into t1 set c1=1, c2=2, c3=1;") 1673 tk.MustInterDirc("create causet t (c1 int, c2 int, c3 int, primary key (c1));") 1674 tk.MustInterDirc("insert into t set c1=1, c2=4;") 1675 tk.MustInterDirc("insert into t select * from t1 limit 1 on duplicate key uFIDelate c3=3333;") 1676 } 1677 1678 func (s *testStochastikSuite2) TestReplace(c *C) { 1679 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1680 1681 // test for https://github.com/whtcorpsinc/milevadb/pull/456 1682 tk.MustInterDirc("drop causet if exists t") 1683 tk.MustInterDirc("drop causet if exists t1") 1684 tk.MustInterDirc("create causet t1 (c1 int, c2 int, c3 int);") 1685 tk.MustInterDirc("replace into t1 set c1=1, c2=2, c3=1;") 1686 tk.MustInterDirc("create causet t (c1 int, c2 int, c3 int, primary key (c1));") 1687 tk.MustInterDirc("replace into t set c1=1, c2=4;") 1688 tk.MustInterDirc("replace into t select * from t1 limit 1;") 1689 } 1690 1691 func (s *testStochastikSuite3) TestDelete(c *C) { 1692 // test for https://github.com/whtcorpsinc/milevadb/pull/1135 1693 1694 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1695 tk1 := testkit.NewTestKit(c, s.causetstore) 1696 tk1.MustInterDirc("create database test1") 1697 tk1.MustInterDirc("use test1") 1698 tk1.MustInterDirc("create causet t (F1 VARCHAR(30));") 1699 tk1.MustInterDirc("insert into t (F1) values ('1'), ('4');") 1700 1701 tk.MustInterDirc("create causet t (F1 VARCHAR(30));") 1702 tk.MustInterDirc("insert into t (F1) values ('1'), ('2');") 1703 tk.MustInterDirc("delete m1 from t m2,t m1 where m1.F1>1;") 1704 tk.MustQuery("select * from t;").Check(testkit.Rows("1")) 1705 1706 tk.MustInterDirc("drop causet if exists t") 1707 tk.MustInterDirc("create causet t (F1 VARCHAR(30));") 1708 tk.MustInterDirc("insert into t (F1) values ('1'), ('2');") 1709 tk.MustInterDirc("delete m1 from t m1,t m2 where true and m1.F1<2;") 1710 tk.MustQuery("select * from t;").Check(testkit.Rows("2")) 1711 1712 tk.MustInterDirc("drop causet if exists t") 1713 tk.MustInterDirc("create causet t (F1 VARCHAR(30));") 1714 tk.MustInterDirc("insert into t (F1) values ('1'), ('2');") 1715 tk.MustInterDirc("delete m1 from t m1,t m2 where false;") 1716 tk.MustQuery("select * from t;").Check(testkit.Rows("1", "2")) 1717 1718 tk.MustInterDirc("drop causet if exists t") 1719 tk.MustInterDirc("create causet t (F1 VARCHAR(30));") 1720 tk.MustInterDirc("insert into t (F1) values ('1'), ('2');") 1721 tk.MustInterDirc("delete m1, m2 from t m1,t m2 where m1.F1>m2.F1;") 1722 tk.MustQuery("select * from t;").Check(testkit.Rows()) 1723 1724 tk.MustInterDirc("drop causet if exists t") 1725 tk.MustInterDirc("create causet t (F1 VARCHAR(30));") 1726 tk.MustInterDirc("insert into t (F1) values ('1'), ('2');") 1727 tk.MustInterDirc("delete test1.t from test1.t inner join test.t where test1.t.F1 > test.t.F1") 1728 tk1.MustQuery("select * from t;").Check(testkit.Rows("1")) 1729 } 1730 1731 func (s *testStochastikSuite2) TestResetCtx(c *C) { 1732 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1733 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 1734 1735 tk.MustInterDirc("create causet t (i int auto_increment not null key);") 1736 tk.MustInterDirc("insert into t values (1);") 1737 tk.MustInterDirc("set @@milevadb_disable_txn_auto_retry = 0") 1738 tk.MustInterDirc("begin;") 1739 tk.MustInterDirc("insert into t values (10);") 1740 tk.MustInterDirc("uFIDelate t set i = i + row_count();") 1741 tk.MustQuery("select * from t;").Check(testkit.Rows("2", "11")) 1742 1743 tk1.MustInterDirc("uFIDelate t set i = 0 where i = 1;") 1744 tk1.MustQuery("select * from t;").Check(testkit.Rows("0")) 1745 1746 tk.MustInterDirc("commit;") 1747 tk.MustQuery("select * from t;").Check(testkit.Rows("1", "11")) 1748 1749 tk.MustInterDirc("delete from t where i = 11;") 1750 tk.MustInterDirc("begin;") 1751 tk.MustInterDirc("insert into t values ();") 1752 tk.MustInterDirc("uFIDelate t set i = i + last_insert_id() + 1;") 1753 tk.MustQuery("select * from t;").Check(testkit.Rows("14", "25")) 1754 1755 tk1.MustInterDirc("uFIDelate t set i = 0 where i = 1;") 1756 tk1.MustQuery("select * from t;").Check(testkit.Rows("0")) 1757 1758 tk.MustInterDirc("commit;") 1759 tk.MustQuery("select * from t;").Check(testkit.Rows("13", "25")) 1760 } 1761 1762 func (s *testStochastikSuite3) TestUnique(c *C) { 1763 // test for https://github.com/whtcorpsinc/milevadb/pull/461 1764 1765 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1766 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 1767 tk2 := testkit.NewTestKitWithInit(c, s.causetstore) 1768 1769 tk.MustInterDirc("set @@milevadb_disable_txn_auto_retry = 0") 1770 tk1.MustInterDirc("set @@milevadb_disable_txn_auto_retry = 0") 1771 tk.MustInterDirc(`CREATE TABLE test ( id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, val int UNIQUE, PRIMARY KEY (id)); `) 1772 tk.MustInterDirc("begin;") 1773 tk.MustInterDirc("insert into test(id, val) values(1, 1);") 1774 tk1.MustInterDirc("begin;") 1775 tk1.MustInterDirc("insert into test(id, val) values(2, 2);") 1776 tk2.MustInterDirc("begin;") 1777 tk2.MustInterDirc("insert into test(id, val) values(1, 2);") 1778 tk2.MustInterDirc("commit;") 1779 _, err := tk.InterDirc("commit") 1780 c.Assert(err, NotNil) 1781 // Check error type and error message 1782 c.Assert(terror.ErrorEqual(err, ekv.ErrKeyExists), IsTrue, Commentf("err %v", err)) 1783 c.Assert(err.Error(), Equals, "previous memex: insert into test(id, val) values(1, 1);: [ekv:1062]Duplicate entry '1' for key 'PRIMARY'") 1784 1785 _, err = tk1.InterDirc("commit") 1786 c.Assert(err, NotNil) 1787 c.Assert(terror.ErrorEqual(err, ekv.ErrKeyExists), IsTrue, Commentf("err %v", err)) 1788 c.Assert(err.Error(), Equals, "previous memex: insert into test(id, val) values(2, 2);: [ekv:1062]Duplicate entry '2' for key 'val'") 1789 1790 // Test for https://github.com/whtcorpsinc/milevadb/issues/463 1791 tk.MustInterDirc("drop causet test;") 1792 tk.MustInterDirc(`CREATE TABLE test ( 1793 id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, 1794 val int UNIQUE, 1795 PRIMARY KEY (id) 1796 );`) 1797 tk.MustInterDirc("insert into test(id, val) values(1, 1);") 1798 _, err = tk.InterDirc("insert into test(id, val) values(2, 1);") 1799 c.Assert(err, NotNil) 1800 tk.MustInterDirc("insert into test(id, val) values(2, 2);") 1801 1802 tk.MustInterDirc("begin;") 1803 tk.MustInterDirc("insert into test(id, val) values(3, 3);") 1804 _, err = tk.InterDirc("insert into test(id, val) values(4, 3);") 1805 c.Assert(err, NotNil) 1806 tk.MustInterDirc("insert into test(id, val) values(4, 4);") 1807 tk.MustInterDirc("commit;") 1808 1809 tk1.MustInterDirc("begin;") 1810 tk1.MustInterDirc("insert into test(id, val) values(5, 6);") 1811 tk.MustInterDirc("begin;") 1812 tk.MustInterDirc("insert into test(id, val) values(20, 6);") 1813 tk.MustInterDirc("commit;") 1814 tk1.InterDirc("commit") 1815 tk1.MustInterDirc("insert into test(id, val) values(5, 5);") 1816 1817 tk.MustInterDirc("drop causet test;") 1818 tk.MustInterDirc(`CREATE TABLE test ( 1819 id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, 1820 val1 int UNIQUE, 1821 val2 int UNIQUE, 1822 PRIMARY KEY (id) 1823 );`) 1824 tk.MustInterDirc("insert into test(id, val1, val2) values(1, 1, 1);") 1825 tk.MustInterDirc("insert into test(id, val1, val2) values(2, 2, 2);") 1826 tk.InterDirc("uFIDelate test set val1 = 3, val2 = 2 where id = 1;") 1827 tk.MustInterDirc("insert into test(id, val1, val2) values(3, 3, 3);") 1828 } 1829 1830 func (s *testStochastikSuite2) TestSet(c *C) { 1831 // Test for https://github.com/whtcorpsinc/milevadb/issues/1114 1832 1833 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1834 tk.MustInterDirc("set @tmp = 0") 1835 tk.MustInterDirc("set @tmp := @tmp + 1") 1836 tk.MustQuery("select @tmp").Check(testkit.Rows("1")) 1837 tk.MustQuery("select @tmp1 = 1, @tmp2 := 2").Check(testkit.Rows("<nil> 2")) 1838 tk.MustQuery("select @tmp1 := 11, @tmp2").Check(testkit.Rows("11 2")) 1839 1840 tk.MustInterDirc("drop causet if exists t") 1841 tk.MustInterDirc("create causet t (c int);") 1842 tk.MustInterDirc("insert into t values (1),(2);") 1843 tk.MustInterDirc("uFIDelate t set c = 3 WHERE c = @var:= 1") 1844 tk.MustQuery("select * from t").Check(testkit.Rows("3", "2")) 1845 tk.MustQuery("select @tmp := count(*) from t").Check(testkit.Rows("2")) 1846 tk.MustQuery("select @tmp := c-2 from t where c=3").Check(testkit.Rows("1")) 1847 } 1848 1849 func (s *testStochastikSuite3) TestMyALLEGROSQLTypes(c *C) { 1850 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1851 tk.MustQuery(`select 0x01 + 1, x'4D7953514C' = "MyALLEGROSQL"`).Check(testkit.Rows("2 1")) 1852 tk.MustQuery(`select 0b01 + 1, 0b01000001 = "A"`).Check(testkit.Rows("2 1")) 1853 } 1854 1855 func (s *testStochastikSuite2) TestIssue986(c *C) { 1856 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1857 sqlText := `CREATE TABLE address ( 1858 id bigint(20) NOT NULL AUTO_INCREMENT, 1859 PRIMARY KEY (id));` 1860 tk.MustInterDirc(sqlText) 1861 tk.MustInterDirc(`insert into address values ('10')`) 1862 } 1863 1864 func (s *testStochastikSuite3) TestCast(c *C) { 1865 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1866 tk.MustQuery("select cast(0.5 as unsigned)") 1867 tk.MustQuery("select cast(-0.5 as signed)") 1868 tk.MustQuery("select hex(cast(0x10 as binary(2)))").Check(testkit.Rows("1000")) 1869 } 1870 1871 func (s *testStochastikSuite2) TestTableInfoMeta(c *C) { 1872 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1873 1874 checkResult := func(affectedRows uint64, insertID uint64) { 1875 gotRows := tk.Se.AffectedRows() 1876 c.Assert(gotRows, Equals, affectedRows) 1877 1878 gotID := tk.Se.LastInsertID() 1879 c.Assert(gotID, Equals, insertID) 1880 } 1881 1882 // create causet 1883 tk.MustInterDirc("CREATE TABLE tbl_test(id INT NOT NULL DEFAULT 1, name varchar(255), PRIMARY KEY(id));") 1884 1885 // insert data 1886 tk.MustInterDirc(`INSERT INTO tbl_test VALUES (1, "hello");`) 1887 checkResult(1, 0) 1888 1889 tk.MustInterDirc(`INSERT INTO tbl_test VALUES (2, "hello");`) 1890 checkResult(1, 0) 1891 1892 tk.MustInterDirc(`UFIDelATE tbl_test SET name = "abc" where id = 2;`) 1893 checkResult(1, 0) 1894 1895 tk.MustInterDirc(`DELETE from tbl_test where id = 2;`) 1896 checkResult(1, 0) 1897 1898 // select data 1899 tk.MustQuery("select * from tbl_test").Check(testkit.Rows("1 hello")) 1900 } 1901 1902 func (s *testStochastikSuite3) TestCaseInsensitive(c *C) { 1903 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1904 1905 tk.MustInterDirc("create causet T (a text, B int)") 1906 tk.MustInterDirc("insert t (A, b) values ('aaa', 1)") 1907 rs, _ := tk.InterDirc("select * from t") 1908 fields := rs.Fields() 1909 c.Assert(fields[0].DeferredCausetAsName.O, Equals, "a") 1910 c.Assert(fields[1].DeferredCausetAsName.O, Equals, "B") 1911 rs, _ = tk.InterDirc("select A, b from t") 1912 fields = rs.Fields() 1913 c.Assert(fields[0].DeferredCausetAsName.O, Equals, "A") 1914 c.Assert(fields[1].DeferredCausetAsName.O, Equals, "b") 1915 rs, _ = tk.InterDirc("select a as A from t where A > 0") 1916 fields = rs.Fields() 1917 c.Assert(fields[0].DeferredCausetAsName.O, Equals, "A") 1918 tk.MustInterDirc("uFIDelate T set b = B + 1") 1919 tk.MustInterDirc("uFIDelate T set B = b + 1") 1920 tk.MustQuery("select b from T").Check(testkit.Rows("3")) 1921 } 1922 1923 // TestDeletePanic is for delete panic 1924 func (s *testStochastikSuite2) TestDeletePanic(c *C) { 1925 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1926 tk.MustInterDirc("create causet t (c int)") 1927 tk.MustInterDirc("insert into t values (1), (2), (3)") 1928 tk.MustInterDirc("delete from `t` where `c` = ?", 1) 1929 tk.MustInterDirc("delete from `t` where `c` = ?", 2) 1930 } 1931 1932 func (s *testStochastikSuite2) TestInformationSchemaCreateTime(c *C) { 1933 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1934 tk.MustInterDirc("create causet t (c int)") 1935 ret := tk.MustQuery("select create_time from information_schema.blocks where block_name='t';") 1936 // Make sure t1 is greater than t. 1937 time.Sleep(time.Second) 1938 tk.MustInterDirc("alter causet t modify c int default 11") 1939 ret1 := tk.MustQuery("select create_time from information_schema.blocks where block_name='t';") 1940 t, err := types.ParseDatetime(nil, ret.Rows()[0][0].(string)) 1941 c.Assert(err, IsNil) 1942 t1, err := types.ParseDatetime(nil, ret1.Rows()[0][0].(string)) 1943 c.Assert(err, IsNil) 1944 r := t1.Compare(t) 1945 c.Assert(r, Equals, 1) 1946 } 1947 1948 type testSchemaSuiteBase struct { 1949 cluster cluster.Cluster 1950 causetstore ekv.CausetStorage 1951 dom *petri.Petri 1952 } 1953 1954 type testSchemaSuite struct { 1955 testSchemaSuiteBase 1956 } 1957 1958 type testSchemaSerialSuite struct { 1959 testSchemaSuiteBase 1960 } 1961 1962 func (s *testSchemaSuiteBase) TearDownTest(c *C) { 1963 tk := testkit.NewTestKitWithInit(c, s.causetstore) 1964 r := tk.MustQuery("show blocks") 1965 for _, tb := range r.Rows() { 1966 blockName := tb[0] 1967 tk.MustInterDirc(fmt.Sprintf("drop causet %v", blockName)) 1968 } 1969 } 1970 1971 func (s *testSchemaSuiteBase) SetUpSuite(c *C) { 1972 testleak.BeforeTest() 1973 causetstore, err := mockstore.NewMockStore( 1974 mockstore.WithClusterInspector(func(c cluster.Cluster) { 1975 mockstore.BootstrapWithSingleStore(c) 1976 s.cluster = c 1977 }), 1978 ) 1979 c.Assert(err, IsNil) 1980 s.causetstore = causetstore 1981 stochastik.DisableStats4Test() 1982 dom, err := stochastik.BootstrapStochastik(s.causetstore) 1983 c.Assert(err, IsNil) 1984 s.dom = dom 1985 } 1986 1987 func (s *testSchemaSuiteBase) TearDownSuite(c *C) { 1988 s.dom.Close() 1989 s.causetstore.Close() 1990 testleak.AfterTest(c)() 1991 } 1992 1993 func (s *testSchemaSerialSuite) TestLoadSchemaFailed(c *C) { 1994 atomic.StoreInt32(&petri.SchemaOutOfDateRetryTimes, int32(3)) 1995 atomic.StoreInt64(&petri.SchemaOutOfDateRetryInterval, int64(20*time.Millisecond)) 1996 defer func() { 1997 atomic.StoreInt32(&petri.SchemaOutOfDateRetryTimes, 10) 1998 atomic.StoreInt64(&petri.SchemaOutOfDateRetryInterval, int64(500*time.Millisecond)) 1999 }() 2000 2001 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2002 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 2003 tk2 := testkit.NewTestKitWithInit(c, s.causetstore) 2004 2005 tk.MustInterDirc("create causet t (a int);") 2006 tk.MustInterDirc("create causet t1 (a int);") 2007 tk.MustInterDirc("create causet t2 (a int);") 2008 2009 tk1.MustInterDirc("begin") 2010 tk2.MustInterDirc("begin") 2011 2012 // Make sure loading information schemaReplicant is failed and server is invalid. 2013 c.Assert(failpoint.Enable("github.com/whtcorpsinc/milevadb/petri/ErrorMockReloadFailed", `return(true)`), IsNil) 2014 err := petri.GetPetri(tk.Se).Reload() 2015 c.Assert(err, NotNil) 2016 2017 lease := petri.GetPetri(tk.Se).DBS().GetLease() 2018 time.Sleep(lease * 2) 2019 2020 // Make sure executing insert memex is failed when server is invalid. 2021 _, err = tk.InterDirc("insert t values (100);") 2022 c.Check(err, NotNil) 2023 2024 tk1.MustInterDirc("insert t1 values (100);") 2025 tk2.MustInterDirc("insert t2 values (100);") 2026 2027 _, err = tk1.InterDirc("commit") 2028 c.Check(err, NotNil) 2029 2030 ver, err := s.causetstore.CurrentVersion() 2031 c.Assert(err, IsNil) 2032 c.Assert(ver, NotNil) 2033 2034 failpoint.Disable("github.com/whtcorpsinc/milevadb/petri/ErrorMockReloadFailed") 2035 time.Sleep(lease * 2) 2036 2037 tk.MustInterDirc("drop causet if exists t;") 2038 tk.MustInterDirc("create causet t (a int);") 2039 tk.MustInterDirc("insert t values (100);") 2040 // Make sure insert to causet t2 transaction executes. 2041 tk2.MustInterDirc("commit") 2042 } 2043 2044 func (s *testSchemaSerialSuite) TestSchemaCheckerALLEGROSQL(c *C) { 2045 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2046 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 2047 2048 // create causet 2049 tk.MustInterDirc(`create causet t (id int, c int);`) 2050 tk.MustInterDirc(`create causet t1 (id int, c int);`) 2051 // insert data 2052 tk.MustInterDirc(`insert into t values(1, 1);`) 2053 2054 // The schemaReplicant version is out of date in the first transaction, but the ALLEGROALLEGROSQL can be retried. 2055 tk.MustInterDirc("set @@milevadb_disable_txn_auto_retry = 0") 2056 tk.MustInterDirc(`begin;`) 2057 tk1.MustInterDirc(`alter causet t add index idx(c);`) 2058 tk.MustInterDirc(`insert into t values(2, 2);`) 2059 tk.MustInterDirc(`commit;`) 2060 2061 // The schemaReplicant version is out of date in the first transaction, and the ALLEGROALLEGROSQL can't be retried. 2062 atomic.StoreUint32(&stochastik.SchemaChangedWithoutRetry, 1) 2063 defer func() { 2064 atomic.StoreUint32(&stochastik.SchemaChangedWithoutRetry, 0) 2065 }() 2066 tk.MustInterDirc(`begin;`) 2067 tk1.MustInterDirc(`alter causet t modify column c bigint;`) 2068 tk.MustInterDirc(`insert into t values(3, 3);`) 2069 _, err := tk.InterDirc(`commit;`) 2070 c.Assert(terror.ErrorEqual(err, petri.ErrSchemaReplicantChanged), IsTrue, Commentf("err %v", err)) 2071 2072 // But the transaction related causet IDs aren't in the uFIDelated causet IDs. 2073 tk.MustInterDirc(`begin;`) 2074 tk1.MustInterDirc(`alter causet t add index idx2(c);`) 2075 tk.MustInterDirc(`insert into t1 values(4, 4);`) 2076 tk.MustInterDirc(`commit;`) 2077 2078 // Test for "select for uFIDelate". 2079 tk.MustInterDirc(`begin;`) 2080 tk1.MustInterDirc(`alter causet t add index idx3(c);`) 2081 tk.MustQuery(`select * from t for uFIDelate`) 2082 _, err = tk.InterDirc(`commit;`) 2083 c.Assert(err, NotNil) 2084 } 2085 2086 func (s *testSchemaSuite) TestPrepareStmtCommitWhenSchemaChanged(c *C) { 2087 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2088 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 2089 2090 tk.MustInterDirc("create causet t (a int, b int)") 2091 tk1.MustInterDirc("prepare stmt from 'insert into t values (?, ?)'") 2092 tk1.MustInterDirc("set @a = 1") 2093 2094 // Commit find unrelated schemaReplicant change. 2095 tk1.MustInterDirc("begin") 2096 tk.MustInterDirc("create causet t1 (id int)") 2097 tk1.MustInterDirc("execute stmt using @a, @a") 2098 tk1.MustInterDirc("commit") 2099 2100 tk1.MustInterDirc("set @@milevadb_disable_txn_auto_retry = 0") 2101 tk1.MustInterDirc("begin") 2102 tk.MustInterDirc("alter causet t drop column b") 2103 tk1.MustInterDirc("execute stmt using @a, @a") 2104 _, err := tk1.InterDirc("commit") 2105 c.Assert(terror.ErrorEqual(err, causetembedded.ErrWrongValueCountOnRow), IsTrue, Commentf("err %v", err)) 2106 } 2107 2108 func (s *testSchemaSuite) TestCommitWhenSchemaChanged(c *C) { 2109 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2110 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 2111 tk.MustInterDirc("create causet t (a int, b int)") 2112 2113 tk1.MustInterDirc("set @@milevadb_disable_txn_auto_retry = 0") 2114 tk1.MustInterDirc("begin") 2115 tk1.MustInterDirc("insert into t values (1, 1)") 2116 2117 tk.MustInterDirc("alter causet t drop column b") 2118 2119 // When tk1 commit, it will find schemaReplicant already changed. 2120 tk1.MustInterDirc("insert into t values (4, 4)") 2121 _, err := tk1.InterDirc("commit") 2122 c.Assert(terror.ErrorEqual(err, causetembedded.ErrWrongValueCountOnRow), IsTrue, Commentf("err %v", err)) 2123 } 2124 2125 func (s *testSchemaSuite) TestRetrySchemaChangeForEmptyChange(c *C) { 2126 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2127 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 2128 tk.MustInterDirc("create causet t (i int)") 2129 tk.MustInterDirc("create causet t1 (i int)") 2130 tk.MustInterDirc("begin") 2131 tk1.MustInterDirc("alter causet t add j int") 2132 tk.MustInterDirc("select * from t for uFIDelate") 2133 tk.MustInterDirc("uFIDelate t set i = -i") 2134 tk.MustInterDirc("delete from t") 2135 tk.MustInterDirc("insert into t1 values (1)") 2136 tk.MustInterDirc("commit") 2137 2138 tk.MustInterDirc("begin pessimistic") 2139 tk1.MustInterDirc("alter causet t add k int") 2140 tk.MustInterDirc("select * from t for uFIDelate") 2141 tk.MustInterDirc("uFIDelate t set i = -i") 2142 tk.MustInterDirc("delete from t") 2143 tk.MustInterDirc("insert into t1 values (1)") 2144 tk.MustInterDirc("commit") 2145 } 2146 2147 func (s *testSchemaSuite) TestRetrySchemaChange(c *C) { 2148 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2149 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 2150 tk.MustInterDirc("create causet t (a int primary key, b int)") 2151 tk.MustInterDirc("insert into t values (1, 1)") 2152 2153 tk1.MustInterDirc("set @@milevadb_disable_txn_auto_retry = 0") 2154 tk1.MustInterDirc("begin") 2155 tk1.MustInterDirc("uFIDelate t set b = 5 where a = 1") 2156 2157 tk.MustInterDirc("alter causet t add index b_i (b)") 2158 2159 run := false 2160 hook := func() { 2161 if !run { 2162 tk.MustInterDirc("uFIDelate t set b = 3 where a = 1") 2163 run = true 2164 } 2165 } 2166 2167 // In order to cover a bug that memex history is not uFIDelated during retry. 2168 // See https://github.com/whtcorpsinc/milevadb/pull/5202 2169 // Step1: when tk1 commit, it find schemaReplicant changed and retry(). 2170 // Step2: during retry, hook() is called, tk uFIDelate primary key. 2171 // Step3: tk1 continue commit in retry() meet a retryable error(write conflict), retry again. 2172 // Step4: tk1 retry() success, if it use the stale memex, data and index will inconsistent. 2173 fpName := "github.com/whtcorpsinc/milevadb/stochastik/preCommitHook" 2174 c.Assert(failpoint.Enable(fpName, "return"), IsNil) 2175 defer func() { c.Assert(failpoint.Disable(fpName), IsNil) }() 2176 2177 ctx := context.WithValue(context.Background(), "__preCommitHook", hook) 2178 err := tk1.Se.CommitTxn(ctx) 2179 c.Assert(err, IsNil) 2180 tk.MustQuery("select * from t where t.b = 5").Check(testkit.Rows("1 5")) 2181 } 2182 2183 func (s *testSchemaSuite) TestRetryMissingUnionScan(c *C) { 2184 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2185 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 2186 tk.MustInterDirc("create causet t (a int primary key, b int unique, c int)") 2187 tk.MustInterDirc("insert into t values (1, 1, 1)") 2188 2189 tk1.MustInterDirc("set @@milevadb_disable_txn_auto_retry = 0") 2190 tk1.MustInterDirc("begin") 2191 tk1.MustInterDirc("uFIDelate t set b = 1, c = 2 where b = 2") 2192 tk1.MustInterDirc("uFIDelate t set b = 1, c = 2 where a = 1") 2193 2194 // Create a conflict to reproduces the bug that the second uFIDelate memex in retry 2195 // has a dirty causet but doesn't use UnionScan. 2196 tk.MustInterDirc("uFIDelate t set b = 2 where a = 1") 2197 2198 tk1.MustInterDirc("commit") 2199 } 2200 2201 func (s *testSchemaSuite) TestTableReaderChunk(c *C) { 2202 // Since normally a single region mock einsteindb only returns one partial result we need to manually split the 2203 // causet to test multiple chunks. 2204 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2205 tk.MustInterDirc("create causet chk (a int)") 2206 for i := 0; i < 100; i++ { 2207 tk.MustInterDirc(fmt.Sprintf("insert chk values (%d)", i)) 2208 } 2209 tbl, err := petri.GetPetri(tk.Se).SchemaReplicant().TableByName(perceptron.NewCIStr("test"), perceptron.NewCIStr("chk")) 2210 c.Assert(err, IsNil) 2211 s.cluster.SplitTable(tbl.Meta().ID, 10) 2212 2213 tk.Se.GetStochastikVars().SetDistALLEGROSQLScanConcurrency(1) 2214 tk.MustInterDirc("set milevadb_init_chunk_size = 2") 2215 defer func() { 2216 tk.MustInterDirc(fmt.Sprintf("set milevadb_init_chunk_size = %d", variable.DefInitChunkSize)) 2217 }() 2218 rs, err := tk.InterDirc("select * from chk") 2219 c.Assert(err, IsNil) 2220 req := rs.NewChunk() 2221 var count int 2222 var numChunks int 2223 for { 2224 err = rs.Next(context.TODO(), req) 2225 c.Assert(err, IsNil) 2226 numRows := req.NumRows() 2227 if numRows == 0 { 2228 break 2229 } 2230 for i := 0; i < numRows; i++ { 2231 c.Assert(req.GetRow(i).GetInt64(0), Equals, int64(count)) 2232 count++ 2233 } 2234 numChunks++ 2235 } 2236 c.Assert(count, Equals, 100) 2237 // FIXME: revert this result to new group value after allegrosql can handle initChunkSize. 2238 c.Assert(numChunks, Equals, 1) 2239 rs.Close() 2240 } 2241 2242 func (s *testSchemaSuite) TestInsertInterDircChunk(c *C) { 2243 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2244 tk.MustInterDirc("create causet test1(a int)") 2245 for i := 0; i < 100; i++ { 2246 tk.MustInterDirc(fmt.Sprintf("insert test1 values (%d)", i)) 2247 } 2248 tk.MustInterDirc("create causet test2(a int)") 2249 2250 tk.Se.GetStochastikVars().SetDistALLEGROSQLScanConcurrency(1) 2251 tk.MustInterDirc("insert into test2(a) select a from test1;") 2252 2253 rs, err := tk.InterDirc("select * from test2") 2254 c.Assert(err, IsNil) 2255 var idx int 2256 for { 2257 req := rs.NewChunk() 2258 err = rs.Next(context.TODO(), req) 2259 c.Assert(err, IsNil) 2260 if req.NumRows() == 0 { 2261 break 2262 } 2263 2264 for rowIdx := 0; rowIdx < req.NumRows(); rowIdx++ { 2265 event := req.GetRow(rowIdx) 2266 c.Assert(event.GetInt64(0), Equals, int64(idx)) 2267 idx++ 2268 } 2269 } 2270 2271 c.Assert(idx, Equals, 100) 2272 rs.Close() 2273 } 2274 2275 func (s *testSchemaSuite) TestUFIDelateInterDircChunk(c *C) { 2276 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2277 tk.MustInterDirc("create causet chk(a int)") 2278 for i := 0; i < 100; i++ { 2279 tk.MustInterDirc(fmt.Sprintf("insert chk values (%d)", i)) 2280 } 2281 2282 tk.Se.GetStochastikVars().SetDistALLEGROSQLScanConcurrency(1) 2283 for i := 0; i < 100; i++ { 2284 tk.MustInterDirc(fmt.Sprintf("uFIDelate chk set a = a + 100 where a = %d", i)) 2285 } 2286 2287 rs, err := tk.InterDirc("select * from chk") 2288 c.Assert(err, IsNil) 2289 var idx int 2290 for { 2291 req := rs.NewChunk() 2292 err = rs.Next(context.TODO(), req) 2293 c.Assert(err, IsNil) 2294 if req.NumRows() == 0 { 2295 break 2296 } 2297 2298 for rowIdx := 0; rowIdx < req.NumRows(); rowIdx++ { 2299 event := req.GetRow(rowIdx) 2300 c.Assert(event.GetInt64(0), Equals, int64(idx+100)) 2301 idx++ 2302 } 2303 } 2304 2305 c.Assert(idx, Equals, 100) 2306 rs.Close() 2307 } 2308 2309 func (s *testSchemaSuite) TestDeleteInterDircChunk(c *C) { 2310 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2311 tk.MustInterDirc("create causet chk(a int)") 2312 2313 for i := 0; i < 100; i++ { 2314 tk.MustInterDirc(fmt.Sprintf("insert chk values (%d)", i)) 2315 } 2316 2317 tk.Se.GetStochastikVars().SetDistALLEGROSQLScanConcurrency(1) 2318 2319 for i := 0; i < 99; i++ { 2320 tk.MustInterDirc(fmt.Sprintf("delete from chk where a = %d", i)) 2321 } 2322 2323 rs, err := tk.InterDirc("select * from chk") 2324 c.Assert(err, IsNil) 2325 2326 req := rs.NewChunk() 2327 err = rs.Next(context.TODO(), req) 2328 c.Assert(err, IsNil) 2329 c.Assert(req.NumRows(), Equals, 1) 2330 2331 event := req.GetRow(0) 2332 c.Assert(event.GetInt64(0), Equals, int64(99)) 2333 rs.Close() 2334 } 2335 2336 func (s *testSchemaSuite) TestDeleteMultiTableInterDircChunk(c *C) { 2337 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2338 tk.MustInterDirc("create causet chk1(a int)") 2339 tk.MustInterDirc("create causet chk2(a int)") 2340 2341 for i := 0; i < 100; i++ { 2342 tk.MustInterDirc(fmt.Sprintf("insert chk1 values (%d)", i)) 2343 } 2344 2345 for i := 0; i < 50; i++ { 2346 tk.MustInterDirc(fmt.Sprintf("insert chk2 values (%d)", i)) 2347 } 2348 2349 tk.Se.GetStochastikVars().SetDistALLEGROSQLScanConcurrency(1) 2350 2351 tk.MustInterDirc("delete chk1, chk2 from chk1 inner join chk2 where chk1.a = chk2.a") 2352 2353 rs, err := tk.InterDirc("select * from chk1") 2354 c.Assert(err, IsNil) 2355 2356 var idx int 2357 for { 2358 req := rs.NewChunk() 2359 err = rs.Next(context.TODO(), req) 2360 c.Assert(err, IsNil) 2361 2362 if req.NumRows() == 0 { 2363 break 2364 } 2365 2366 for i := 0; i < req.NumRows(); i++ { 2367 event := req.GetRow(i) 2368 c.Assert(event.GetInt64(0), Equals, int64(idx+50)) 2369 idx++ 2370 } 2371 } 2372 c.Assert(idx, Equals, 50) 2373 rs.Close() 2374 2375 rs, err = tk.InterDirc("select * from chk2") 2376 c.Assert(err, IsNil) 2377 2378 req := rs.NewChunk() 2379 err = rs.Next(context.TODO(), req) 2380 c.Assert(err, IsNil) 2381 c.Assert(req.NumRows(), Equals, 0) 2382 rs.Close() 2383 } 2384 2385 func (s *testSchemaSuite) TestIndexLookUpReaderChunk(c *C) { 2386 // Since normally a single region mock einsteindb only returns one partial result we need to manually split the 2387 // causet to test multiple chunks. 2388 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2389 tk.MustInterDirc("drop causet if exists chk") 2390 tk.MustInterDirc("create causet chk (k int unique, c int)") 2391 for i := 0; i < 100; i++ { 2392 tk.MustInterDirc(fmt.Sprintf("insert chk values (%d, %d)", i, i)) 2393 } 2394 tbl, err := petri.GetPetri(tk.Se).SchemaReplicant().TableByName(perceptron.NewCIStr("test"), perceptron.NewCIStr("chk")) 2395 c.Assert(err, IsNil) 2396 s.cluster.SplitIndex(tbl.Meta().ID, tbl.Indices()[0].Meta().ID, 10) 2397 2398 tk.Se.GetStochastikVars().IndexLookupSize = 10 2399 rs, err := tk.InterDirc("select * from chk order by k") 2400 c.Assert(err, IsNil) 2401 req := rs.NewChunk() 2402 var count int 2403 for { 2404 err = rs.Next(context.TODO(), req) 2405 c.Assert(err, IsNil) 2406 numRows := req.NumRows() 2407 if numRows == 0 { 2408 break 2409 } 2410 for i := 0; i < numRows; i++ { 2411 c.Assert(req.GetRow(i).GetInt64(0), Equals, int64(count)) 2412 c.Assert(req.GetRow(i).GetInt64(1), Equals, int64(count)) 2413 count++ 2414 } 2415 } 2416 c.Assert(count, Equals, 100) 2417 rs.Close() 2418 2419 rs, err = tk.InterDirc("select k from chk where c < 90 order by k") 2420 c.Assert(err, IsNil) 2421 req = rs.NewChunk() 2422 count = 0 2423 for { 2424 err = rs.Next(context.TODO(), req) 2425 c.Assert(err, IsNil) 2426 numRows := req.NumRows() 2427 if numRows == 0 { 2428 break 2429 } 2430 for i := 0; i < numRows; i++ { 2431 c.Assert(req.GetRow(i).GetInt64(0), Equals, int64(count)) 2432 count++ 2433 } 2434 } 2435 c.Assert(count, Equals, 90) 2436 rs.Close() 2437 } 2438 2439 func (s *testStochastikSuite2) TestStatementErrorInTransaction(c *C) { 2440 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2441 tk.MustInterDirc("create causet memex_side_effect (c int primary key)") 2442 tk.MustInterDirc("begin") 2443 tk.MustInterDirc("insert into memex_side_effect values (1)") 2444 _, err := tk.InterDirc("insert into memex_side_effect value (2),(3),(4),(1)") 2445 c.Assert(err, NotNil) 2446 tk.MustQuery(`select * from memex_side_effect`).Check(testkit.Rows("1")) 2447 tk.MustInterDirc("commit") 2448 tk.MustQuery(`select * from memex_side_effect`).Check(testkit.Rows("1")) 2449 2450 tk.MustInterDirc("drop causet if exists test;") 2451 tk.MustInterDirc(`create causet test ( 2452 a int(11) DEFAULT NULL, 2453 b int(11) DEFAULT NULL 2454 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;`) 2455 tk.MustInterDirc("insert into test values (1, 2), (1, 2), (1, 1), (1, 1);") 2456 2457 tk.MustInterDirc("start transaction;") 2458 // In the transaction, memex error should not rollback the transaction. 2459 _, err = tk.InterDirc("uFIDelate tset set b=11 where a=1 and b=2;") 2460 c.Assert(err, NotNil) 2461 // Test for a bug that last line rollback and exit transaction, this line autocommit. 2462 tk.MustInterDirc("uFIDelate test set b = 11 where a = 1 and b = 2;") 2463 tk.MustInterDirc("rollback") 2464 tk.MustQuery("select * from test where a = 1 and b = 11").Check(testkit.Rows()) 2465 } 2466 2467 func (s *testStochastikSerialSuite) TestStatementCountLimit(c *C) { 2468 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2469 tk.MustInterDirc("create causet stmt_count_limit (id int)") 2470 defer config.RestoreFunc()() 2471 config.UFIDelateGlobal(func(conf *config.Config) { 2472 conf.Performance.StmtCountLimit = 3 2473 }) 2474 tk.MustInterDirc("set milevadb_disable_txn_auto_retry = 0") 2475 tk.MustInterDirc("begin") 2476 tk.MustInterDirc("insert into stmt_count_limit values (1)") 2477 tk.MustInterDirc("insert into stmt_count_limit values (2)") 2478 _, err := tk.InterDirc("insert into stmt_count_limit values (3)") 2479 c.Assert(err, NotNil) 2480 2481 // begin is counted into history but this one is not. 2482 tk.MustInterDirc("SET SESSION autocommit = false") 2483 tk.MustInterDirc("insert into stmt_count_limit values (1)") 2484 tk.MustInterDirc("insert into stmt_count_limit values (2)") 2485 tk.MustInterDirc("insert into stmt_count_limit values (3)") 2486 _, err = tk.InterDirc("insert into stmt_count_limit values (4)") 2487 c.Assert(err, NotNil) 2488 } 2489 2490 func (s *testStochastikSerialSuite) TestBatchCommit(c *C) { 2491 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2492 tk.MustInterDirc("set milevadb_batch_commit = 1") 2493 tk.MustInterDirc("set milevadb_disable_txn_auto_retry = 0") 2494 tk.MustInterDirc("create causet t (id int)") 2495 defer config.RestoreFunc()() 2496 config.UFIDelateGlobal(func(conf *config.Config) { 2497 conf.Performance.StmtCountLimit = 3 2498 }) 2499 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 2500 tk.MustInterDirc("SET SESSION autocommit = 1") 2501 tk.MustInterDirc("begin") 2502 tk.MustInterDirc("insert into t values (1)") 2503 tk1.MustQuery("select * from t").Check(testkit.Rows()) 2504 tk.MustInterDirc("insert into t values (2)") 2505 tk1.MustQuery("select * from t").Check(testkit.Rows()) 2506 tk.MustInterDirc("rollback") 2507 tk1.MustQuery("select * from t").Check(testkit.Rows()) 2508 2509 // The above rollback will not make the stochastik in transaction. 2510 tk.MustInterDirc("insert into t values (1)") 2511 tk1.MustQuery("select * from t").Check(testkit.Rows("1")) 2512 tk.MustInterDirc("delete from t") 2513 2514 tk.MustInterDirc("begin") 2515 tk.MustInterDirc("insert into t values (5)") 2516 tk1.MustQuery("select * from t").Check(testkit.Rows()) 2517 tk.MustInterDirc("insert into t values (6)") 2518 tk1.MustQuery("select * from t").Check(testkit.Rows()) 2519 tk.MustInterDirc("insert into t values (7)") 2520 tk1.MustQuery("select * from t").Check(testkit.Rows("5", "6", "7")) 2521 2522 // The stochastik is still in transaction. 2523 tk.MustInterDirc("insert into t values (8)") 2524 tk1.MustQuery("select * from t").Check(testkit.Rows("5", "6", "7")) 2525 tk.MustInterDirc("insert into t values (9)") 2526 tk1.MustQuery("select * from t").Check(testkit.Rows("5", "6", "7")) 2527 tk.MustInterDirc("insert into t values (10)") 2528 tk1.MustQuery("select * from t").Check(testkit.Rows("5", "6", "7")) 2529 tk.MustInterDirc("commit") 2530 tk1.MustQuery("select * from t").Check(testkit.Rows("5", "6", "7", "8", "9", "10")) 2531 2532 // The above commit will not make the stochastik in transaction. 2533 tk.MustInterDirc("insert into t values (11)") 2534 tk1.MustQuery("select * from t").Check(testkit.Rows("5", "6", "7", "8", "9", "10", "11")) 2535 2536 tk.MustInterDirc("delete from t") 2537 tk.MustInterDirc("SET SESSION autocommit = 0") 2538 tk.MustInterDirc("insert into t values (1)") 2539 tk.MustInterDirc("insert into t values (2)") 2540 tk.MustInterDirc("insert into t values (3)") 2541 tk.MustInterDirc("rollback") 2542 tk1.MustInterDirc("insert into t values (4)") 2543 tk1.MustInterDirc("insert into t values (5)") 2544 tk.MustQuery("select * from t").Check(testkit.Rows("4", "5")) 2545 } 2546 2547 func (s *testStochastikSuite3) TestCastTimeToDate(c *C) { 2548 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2549 tk.MustInterDirc("set time_zone = '-8:00'") 2550 date := time.Now().In(time.FixedZone("", -8*int(time.Hour/time.Second))) 2551 tk.MustQuery("select cast(time('12:23:34') as date)").Check(testkit.Rows(date.Format("2006-01-02"))) 2552 2553 tk.MustInterDirc("set time_zone = '+08:00'") 2554 date = time.Now().In(time.FixedZone("", 8*int(time.Hour/time.Second))) 2555 tk.MustQuery("select cast(time('12:23:34') as date)").Check(testkit.Rows(date.Format("2006-01-02"))) 2556 } 2557 2558 func (s *testStochastikSuite) TestSetGlobalTZ(c *C) { 2559 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2560 tk.MustInterDirc("set time_zone = '+08:00'") 2561 tk.MustQuery("show variables like 'time_zone'").Check(testkit.Rows("time_zone +08:00")) 2562 2563 tk.MustInterDirc("set global time_zone = '+00:00'") 2564 2565 tk.MustQuery("show variables like 'time_zone'").Check(testkit.Rows("time_zone +08:00")) 2566 2567 // Disable global variable cache, so load global stochastik variable take effect immediate. 2568 s.dom.GetGlobalVarsCache().Disable() 2569 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 2570 tk1.MustQuery("show variables like 'time_zone'").Check(testkit.Rows("time_zone +00:00")) 2571 } 2572 2573 func (s *testStochastikSuite2) TestRollbackOnCompileError(c *C) { 2574 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2575 tk.MustInterDirc("create causet t (a int)") 2576 tk.MustInterDirc("insert t values (1)") 2577 2578 tk2 := testkit.NewTestKitWithInit(c, s.causetstore) 2579 tk2.MustQuery("select * from t").Check(testkit.Rows("1")) 2580 2581 tk.MustInterDirc("rename causet t to t2") 2582 2583 var meetErr bool 2584 for i := 0; i < 100; i++ { 2585 _, err := tk2.InterDirc("insert t values (1)") 2586 if err != nil { 2587 meetErr = true 2588 break 2589 } 2590 } 2591 c.Assert(meetErr, IsTrue) 2592 tk.MustInterDirc("rename causet t2 to t") 2593 var recoverErr bool 2594 for i := 0; i < 100; i++ { 2595 _, err := tk2.InterDirc("insert t values (1)") 2596 if err == nil { 2597 recoverErr = true 2598 break 2599 } 2600 } 2601 c.Assert(recoverErr, IsTrue) 2602 } 2603 2604 func (s *testStochastikSuite3) TestSetTransactionIsolationOneShot(c *C) { 2605 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2606 tk.MustInterDirc("create causet t (k int, v int)") 2607 tk.MustInterDirc("insert t values (1, 42)") 2608 tk.MustInterDirc("set tx_isolation = 'read-committed'") 2609 tk.MustQuery("select @@tx_isolation").Check(testkit.Rows("READ-COMMITTED")) 2610 tk.MustInterDirc("set tx_isolation = 'repeablock-read'") 2611 tk.MustInterDirc("set transaction isolation level read committed") 2612 tk.MustQuery("select @@tx_isolation_one_shot").Check(testkit.Rows("READ-COMMITTED")) 2613 tk.MustQuery("select @@tx_isolation").Check(testkit.Rows("REPEATABLE-READ")) 2614 2615 // Check isolation level is set to read committed. 2616 ctx := context.WithValue(context.Background(), "CheckSelectRequestHook", func(req *ekv.Request) { 2617 c.Assert(req.IsolationLevel, Equals, ekv.SI) 2618 }) 2619 tk.Se.InterDircute(ctx, "select * from t where k = 1") 2620 2621 // Check it just take effect for one time. 2622 ctx = context.WithValue(context.Background(), "CheckSelectRequestHook", func(req *ekv.Request) { 2623 c.Assert(req.IsolationLevel, Equals, ekv.SI) 2624 }) 2625 tk.Se.InterDircute(ctx, "select * from t where k = 1") 2626 2627 // Can't change isolation level when it's inside a transaction. 2628 tk.MustInterDirc("begin") 2629 _, err := tk.Se.InterDircute(ctx, "set transaction isolation level read committed") 2630 c.Assert(err, NotNil) 2631 } 2632 2633 func (s *testStochastikSuite2) TestDBUserNameLength(c *C) { 2634 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2635 tk.MustInterDirc("create causet if not exists t (a int)") 2636 // Test user name length can be longer than 16. 2637 tk.MustInterDirc(`CREATE USER 'abcddfjakldfjaldddds'@'%' identified by ''`) 2638 tk.MustInterDirc(`grant all privileges on test.* to 'abcddfjakldfjaldddds'@'%'`) 2639 tk.MustInterDirc(`grant all privileges on test.t to 'abcddfjakldfjaldddds'@'%'`) 2640 } 2641 2642 func (s *testStochastikSerialSuite) TestKVVars(c *C) { 2643 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2644 tk.MustInterDirc("set @@milevadb_backoff_lock_fast = 1") 2645 tk.MustInterDirc("set @@milevadb_backoff_weight = 100") 2646 tk.MustInterDirc("create causet if not exists ekvvars (a int key)") 2647 tk.MustInterDirc("insert into ekvvars values (1)") 2648 tk.MustInterDirc("begin") 2649 txn, err := tk.Se.Txn(false) 2650 c.Assert(err, IsNil) 2651 vars := txn.GetVars() 2652 c.Assert(vars.BackoffLockFast, Equals, 1) 2653 c.Assert(vars.BackOffWeight, Equals, 100) 2654 tk.MustInterDirc("rollback") 2655 tk.MustInterDirc("set @@milevadb_backoff_weight = 50") 2656 tk.MustInterDirc("set @@autocommit = 0") 2657 tk.MustInterDirc("select * from ekvvars") 2658 c.Assert(tk.Se.GetStochastikVars().InTxn(), IsTrue) 2659 txn, err = tk.Se.Txn(false) 2660 c.Assert(err, IsNil) 2661 vars = txn.GetVars() 2662 c.Assert(vars.BackOffWeight, Equals, 50) 2663 2664 tk.MustInterDirc("set @@autocommit = 1") 2665 c.Assert(failpoint.Enable("github.com/whtcorpsinc/milevadb/causetstore/einsteindb/probeSetVars", `return(true)`), IsNil) 2666 tk.MustInterDirc("select * from ekvvars where a = 1") 2667 c.Assert(failpoint.Disable("github.com/whtcorpsinc/milevadb/causetstore/einsteindb/probeSetVars"), IsNil) 2668 c.Assert(einsteindb.SetSuccess, IsTrue) 2669 einsteindb.SetSuccess = false 2670 } 2671 2672 func (s *testStochastikSuite2) TestCommitRetryCount(c *C) { 2673 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 2674 tk2 := testkit.NewTestKitWithInit(c, s.causetstore) 2675 tk1.MustInterDirc("create causet no_retry (id int)") 2676 tk1.MustInterDirc("insert into no_retry values (1)") 2677 tk1.MustInterDirc("set @@milevadb_retry_limit = 0") 2678 2679 tk1.MustInterDirc("begin") 2680 tk1.MustInterDirc("uFIDelate no_retry set id = 2") 2681 2682 tk2.MustInterDirc("begin") 2683 tk2.MustInterDirc("uFIDelate no_retry set id = 3") 2684 tk2.MustInterDirc("commit") 2685 2686 // No auto retry because retry limit is set to 0. 2687 _, err := tk1.Se.InterDircute(context.Background(), "commit") 2688 c.Assert(err, NotNil) 2689 } 2690 2691 func (s *testStochastikSuite3) TestEnablePartition(c *C) { 2692 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2693 tk.MustInterDirc("set milevadb_enable_block_partition=off") 2694 tk.MustQuery("show variables like 'milevadb_enable_block_partition'").Check(testkit.Rows("milevadb_enable_block_partition off")) 2695 2696 tk.MustInterDirc("set global milevadb_enable_block_partition = on") 2697 2698 tk.MustQuery("show variables like 'milevadb_enable_block_partition'").Check(testkit.Rows("milevadb_enable_block_partition off")) 2699 tk.MustQuery("show global variables like 'milevadb_enable_block_partition'").Check(testkit.Rows("milevadb_enable_block_partition on")) 2700 2701 // Disable global variable cache, so load global stochastik variable take effect immediate. 2702 s.dom.GetGlobalVarsCache().Disable() 2703 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 2704 tk1.MustQuery("show variables like 'milevadb_enable_block_partition'").Check(testkit.Rows("milevadb_enable_block_partition on")) 2705 } 2706 2707 func (s *testStochastikSerialSuite) TestTxnRetryErrMsg(c *C) { 2708 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 2709 tk2 := testkit.NewTestKitWithInit(c, s.causetstore) 2710 tk1.MustInterDirc("create causet no_retry (id int)") 2711 tk1.MustInterDirc("insert into no_retry values (1)") 2712 tk1.MustInterDirc("begin") 2713 tk2.MustInterDirc("uFIDelate no_retry set id = id + 1") 2714 tk1.MustInterDirc("uFIDelate no_retry set id = id + 1") 2715 c.Assert(failpoint.Enable("github.com/whtcorpsinc/milevadb/causetstore/einsteindb/ErrMockRetryableOnly", `return(true)`), IsNil) 2716 _, err := tk1.Se.InterDircute(context.Background(), "commit") 2717 c.Assert(failpoint.Disable("github.com/whtcorpsinc/milevadb/causetstore/einsteindb/ErrMockRetryableOnly"), IsNil) 2718 c.Assert(err, NotNil) 2719 c.Assert(ekv.ErrTxnRetryable.Equal(err), IsTrue, Commentf("error: %s", err)) 2720 c.Assert(strings.Contains(err.Error(), "mock retryable error"), IsTrue, Commentf("error: %s", err)) 2721 c.Assert(strings.Contains(err.Error(), ekv.TxnRetryableMark), IsTrue, Commentf("error: %s", err)) 2722 } 2723 2724 func (s *testSchemaSuite) TestDisableTxnAutoRetry(c *C) { 2725 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 2726 tk2 := testkit.NewTestKitWithInit(c, s.causetstore) 2727 tk1.MustInterDirc("create causet no_retry (id int)") 2728 tk1.MustInterDirc("insert into no_retry values (1)") 2729 tk1.MustInterDirc("set @@milevadb_disable_txn_auto_retry = 1") 2730 2731 tk1.MustInterDirc("begin") 2732 tk1.MustInterDirc("uFIDelate no_retry set id = 2") 2733 2734 tk2.MustInterDirc("begin") 2735 tk2.MustInterDirc("uFIDelate no_retry set id = 3") 2736 tk2.MustInterDirc("commit") 2737 2738 // No auto retry because milevadb_disable_txn_auto_retry is set to 1. 2739 _, err := tk1.Se.InterDircute(context.Background(), "commit") 2740 c.Assert(err, NotNil) 2741 2742 // stochastik 1 starts a transaction early. 2743 // execute a select memex to clear retry history. 2744 tk1.MustInterDirc("select 1") 2745 tk1.Se.PrepareTxnCtx(context.Background()) 2746 // stochastik 2 uFIDelate the value. 2747 tk2.MustInterDirc("uFIDelate no_retry set id = 4") 2748 // AutoCommit uFIDelate will retry, so it would not fail. 2749 tk1.MustInterDirc("uFIDelate no_retry set id = 5") 2750 2751 // RestrictedALLEGROSQL should retry. 2752 tk1.Se.GetStochastikVars().InRestrictedALLEGROSQL = true 2753 tk1.MustInterDirc("begin") 2754 2755 tk2.MustInterDirc("uFIDelate no_retry set id = 6") 2756 2757 tk1.MustInterDirc("uFIDelate no_retry set id = 7") 2758 tk1.MustInterDirc("commit") 2759 2760 // test for disable transaction local latch 2761 tk1.Se.GetStochastikVars().InRestrictedALLEGROSQL = false 2762 defer config.RestoreFunc()() 2763 config.UFIDelateGlobal(func(conf *config.Config) { 2764 conf.TxnLocalLatches.Enabled = false 2765 }) 2766 tk1.MustInterDirc("begin") 2767 tk1.MustInterDirc("uFIDelate no_retry set id = 9") 2768 2769 tk2.MustInterDirc("uFIDelate no_retry set id = 8") 2770 2771 _, err = tk1.Se.InterDircute(context.Background(), "commit") 2772 c.Assert(err, NotNil) 2773 c.Assert(ekv.ErrWriteConflict.Equal(err), IsTrue, Commentf("error: %s", err)) 2774 c.Assert(strings.Contains(err.Error(), ekv.TxnRetryableMark), IsTrue, Commentf("error: %s", err)) 2775 tk1.MustInterDirc("rollback") 2776 2777 config.UFIDelateGlobal(func(conf *config.Config) { 2778 conf.TxnLocalLatches.Enabled = true 2779 }) 2780 tk1.MustInterDirc("begin") 2781 tk2.MustInterDirc("alter causet no_retry add index idx(id)") 2782 tk2.MustQuery("select * from no_retry").Check(testkit.Rows("8")) 2783 tk1.MustInterDirc("uFIDelate no_retry set id = 10") 2784 _, err = tk1.Se.InterDircute(context.Background(), "commit") 2785 c.Assert(err, NotNil) 2786 2787 // set autocommit to begin and commit 2788 tk1.MustInterDirc("set autocommit = 0") 2789 tk1.MustQuery("select * from no_retry").Check(testkit.Rows("8")) 2790 tk2.MustInterDirc("uFIDelate no_retry set id = 11") 2791 tk1.MustInterDirc("uFIDelate no_retry set id = 12") 2792 _, err = tk1.Se.InterDircute(context.Background(), "set autocommit = 1") 2793 c.Assert(err, NotNil) 2794 c.Assert(ekv.ErrWriteConflict.Equal(err), IsTrue, Commentf("error: %s", err)) 2795 c.Assert(strings.Contains(err.Error(), ekv.TxnRetryableMark), IsTrue, Commentf("error: %s", err)) 2796 tk1.MustInterDirc("rollback") 2797 tk2.MustQuery("select * from no_retry").Check(testkit.Rows("11")) 2798 2799 tk1.MustInterDirc("set autocommit = 0") 2800 tk1.MustQuery("select * from no_retry").Check(testkit.Rows("11")) 2801 tk2.MustInterDirc("uFIDelate no_retry set id = 13") 2802 tk1.MustInterDirc("uFIDelate no_retry set id = 14") 2803 _, err = tk1.Se.InterDircute(context.Background(), "commit") 2804 c.Assert(err, NotNil) 2805 c.Assert(ekv.ErrWriteConflict.Equal(err), IsTrue, Commentf("error: %s", err)) 2806 c.Assert(strings.Contains(err.Error(), ekv.TxnRetryableMark), IsTrue, Commentf("error: %s", err)) 2807 tk1.MustInterDirc("rollback") 2808 tk2.MustQuery("select * from no_retry").Check(testkit.Rows("13")) 2809 } 2810 2811 // TestSetGroupConcatMaxLen is for issue #7034 2812 func (s *testStochastikSuite2) TestSetGroupConcatMaxLen(c *C) { 2813 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2814 2815 // Normal case 2816 tk.MustInterDirc("set global group_concat_max_len = 100") 2817 tk.MustInterDirc("set @@stochastik.group_concat_max_len = 50") 2818 result := tk.MustQuery("show global variables where variable_name='group_concat_max_len';") 2819 result.Check(testkit.Rows("group_concat_max_len 100")) 2820 2821 result = tk.MustQuery("show stochastik variables where variable_name='group_concat_max_len';") 2822 result.Check(testkit.Rows("group_concat_max_len 50")) 2823 2824 result = tk.MustQuery("select @@group_concat_max_len;") 2825 result.Check(testkit.Rows("50")) 2826 2827 result = tk.MustQuery("select @@global.group_concat_max_len;") 2828 result.Check(testkit.Rows("100")) 2829 2830 result = tk.MustQuery("select @@stochastik.group_concat_max_len;") 2831 result.Check(testkit.Rows("50")) 2832 2833 tk.MustInterDirc("set @@group_concat_max_len = 1024") 2834 2835 result = tk.MustQuery("select @@group_concat_max_len;") 2836 result.Check(testkit.Rows("1024")) 2837 2838 result = tk.MustQuery("select @@global.group_concat_max_len;") 2839 result.Check(testkit.Rows("100")) 2840 2841 result = tk.MustQuery("select @@stochastik.group_concat_max_len;") 2842 result.Check(testkit.Rows("1024")) 2843 2844 // Test value out of range 2845 tk.MustInterDirc("set @@group_concat_max_len=1") 2846 tk.MustQuery("show warnings").Check(solitonutil.RowsWithSep("|", "Warning|1292|Truncated incorrect group_concat_max_len value: '1'")) 2847 result = tk.MustQuery("select @@group_concat_max_len;") 2848 result.Check(testkit.Rows("4")) 2849 2850 _, err := tk.InterDirc("set @@group_concat_max_len = 18446744073709551616") 2851 c.Assert(terror.ErrorEqual(err, variable.ErrWrongTypeForVar), IsTrue, Commentf("err %v", err)) 2852 2853 // Test illegal type 2854 _, err = tk.InterDirc("set @@group_concat_max_len='hello'") 2855 c.Assert(terror.ErrorEqual(err, variable.ErrWrongTypeForVar), IsTrue, Commentf("err %v", err)) 2856 } 2857 2858 func (s *testStochastikSuite2) TestUFIDelatePrivilege(c *C) { 2859 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2860 tk.MustInterDirc("drop causet if exists t1, t2;") 2861 tk.MustInterDirc("create causet t1 (id int);") 2862 tk.MustInterDirc("create causet t2 (id int);") 2863 tk.MustInterDirc("insert into t1 values (1);") 2864 tk.MustInterDirc("insert into t2 values (2);") 2865 tk.MustInterDirc("create user xxx;") 2866 tk.MustInterDirc("grant all on test.t1 to xxx;") 2867 tk.MustInterDirc("grant select on test.t2 to xxx;") 2868 2869 tk1 := testkit.NewTestKitWithInit(c, s.causetstore) 2870 c.Assert(tk1.Se.Auth(&auth.UserIdentity{Username: "xxx", Hostname: "localhost"}, 2871 []byte(""), 2872 []byte("")), IsTrue) 2873 2874 _, err := tk1.InterDirc("uFIDelate t2 set id = 666 where id = 1;") 2875 c.Assert(err, NotNil) 2876 c.Assert(strings.Contains(err.Error(), "privilege check fail"), IsTrue) 2877 2878 // Cover a bug that t1 and t2 both require uFIDelate privilege. 2879 // In fact, the privlege check for t1 should be uFIDelate, and for t2 should be select. 2880 _, err = tk1.InterDirc("uFIDelate t1,t2 set t1.id = t2.id;") 2881 c.Assert(err, IsNil) 2882 2883 // Fix issue 8911 2884 tk.MustInterDirc("create database weperk") 2885 tk.MustInterDirc("use weperk") 2886 tk.MustInterDirc("create causet tb_wehub_server (id int, active_count int, used_count int)") 2887 tk.MustInterDirc("create user 'weperk'") 2888 tk.MustInterDirc("grant all privileges on weperk.* to 'weperk'@'%'") 2889 c.Assert(tk1.Se.Auth(&auth.UserIdentity{Username: "weperk", Hostname: "%"}, 2890 []byte(""), []byte("")), IsTrue) 2891 tk1.MustInterDirc("use weperk") 2892 tk1.MustInterDirc("uFIDelate tb_wehub_server a set a.active_count=a.active_count+1,a.used_count=a.used_count+1 where id=1") 2893 2894 tk.MustInterDirc("create database service") 2895 tk.MustInterDirc("create database report") 2896 tk.MustInterDirc(`CREATE TABLE service.t1 ( 2897 id int(11) DEFAULT NULL, 2898 a bigint(20) NOT NULL, 2899 b text DEFAULT NULL, 2900 PRIMARY KEY (a) 2901 )`) 2902 tk.MustInterDirc(`CREATE TABLE report.t2 ( 2903 a bigint(20) DEFAULT NULL, 2904 c bigint(20) NOT NULL 2905 )`) 2906 tk.MustInterDirc("grant all privileges on service.* to weperk") 2907 tk.MustInterDirc("grant all privileges on report.* to weperk") 2908 tk1.Se.GetStochastikVars().CurrentDB = "" 2909 tk1.MustInterDirc(`uFIDelate service.t1 s, 2910 report.t2 t 2911 set s.a = t.a 2912 WHERE 2913 s.a = t.a 2914 and t.c >= 1 and t.c <= 10000 2915 and s.b !='xx';`) 2916 2917 // Fix issue 10028 2918 tk.MustInterDirc("create database ap") 2919 tk.MustInterDirc("create database tp") 2920 tk.MustInterDirc("grant all privileges on ap.* to xxx") 2921 tk.MustInterDirc("grant select on tp.* to xxx") 2922 tk.MustInterDirc("create causet tp.record( id int,name varchar(128),age int)") 2923 tk.MustInterDirc("insert into tp.record (id,name,age) values (1,'john',18),(2,'lary',19),(3,'lily',18)") 2924 tk.MustInterDirc("create causet ap.record( id int,name varchar(128),age int)") 2925 tk.MustInterDirc("insert into ap.record(id) values(1)") 2926 c.Assert(tk1.Se.Auth(&auth.UserIdentity{Username: "xxx", Hostname: "localhost"}, 2927 []byte(""), 2928 []byte("")), IsTrue) 2929 _, err2 := tk1.InterDirc("uFIDelate ap.record t inner join tp.record tt on t.id=tt.id set t.name=tt.name") 2930 c.Assert(err2, IsNil) 2931 } 2932 2933 func (s *testStochastikSuite2) TestTxnGoString(c *C) { 2934 tk := testkit.NewTestKitWithInit(c, s.causetstore) 2935 tk.MustInterDirc("drop causet if exists gostr;") 2936 tk.MustInterDirc("create causet gostr (id int);") 2937 txn, err := tk.Se.Txn(false) 2938 c.Assert(err, IsNil) 2939 str1 := fmt.Sprintf("%#v", txn) 2940 c.Assert(str1, Equals, "Txn{state=invalid}") 2941 tk.MustInterDirc("begin") 2942 txn, err = tk.Se.Txn(false) 2943 c.Assert(err, IsNil) 2944 c.Assert(fmt.Sprintf("%#v", txn), Equals, fmt.Sprintf("Txn{state=valid, txnStartTS=%d}", txn.StartTS())) 2945 2946 tk.MustInterDirc("insert into gostr values (1)") 2947 c.Assert(fmt.Sprintf("%#v", txn), Equals, fmt.Sprintf("Txn{state=valid, txnStartTS=%d}", txn.StartTS())) 2948 2949 tk.MustInterDirc("rollback") 2950 c.Assert(fmt.Sprintf("%#v", txn), Equals, "Txn{state=invalid}") 2951 } 2952 2953 func (s *testStochastikSuite3) TestMaxInterDiructeTime(c *C) { 2954 var err error 2955 tk := testkit.NewTestKit(c, s.causetstore) 2956 tk.Se, err = stochastik.CreateStochastik4Test(s.causetstore) 2957 c.Assert(err, IsNil) 2958 2959 tk.MustInterDirc("use test") 2960 tk.MustInterDirc("create causet MaxInterDircTime( id int,name varchar(128),age int);") 2961 tk.MustInterDirc("begin") 2962 tk.MustInterDirc("insert into MaxInterDircTime (id,name,age) values (1,'john',18),(2,'lary',19),(3,'lily',18);") 2963 2964 tk.MustQuery("select /*+ MAX_EXECUTION_TIME(1000) MAX_EXECUTION_TIME(500) */ * FROM MaxInterDircTime;") 2965 c.Assert(tk.Se.GetStochastikVars().StmtCtx.GetWarnings(), HasLen, 1) 2966 c.Assert(tk.Se.GetStochastikVars().StmtCtx.GetWarnings()[0].Err.Error(), Equals, "MAX_EXECUTION_TIME() is defined more than once, only the last definition takes effect: MAX_EXECUTION_TIME(500)") 2967 c.Assert(tk.Se.GetStochastikVars().StmtCtx.HasMaxInterDircutionTime, Equals, true) 2968 c.Assert(tk.Se.GetStochastikVars().StmtCtx.MaxInterDircutionTime, Equals, uint64(500)) 2969 2970 tk.MustQuery("select @@MAX_EXECUTION_TIME;").Check(testkit.Rows("0")) 2971 tk.MustQuery("select @@global.MAX_EXECUTION_TIME;").Check(testkit.Rows("0")) 2972 tk.MustQuery("select /*+ MAX_EXECUTION_TIME(1000) */ * FROM MaxInterDircTime;") 2973 2974 tk.MustInterDirc("set @@global.MAX_EXECUTION_TIME = 300;") 2975 tk.MustQuery("select * FROM MaxInterDircTime;") 2976 2977 tk.MustInterDirc("set @@MAX_EXECUTION_TIME = 150;") 2978 tk.MustQuery("select * FROM MaxInterDircTime;") 2979 2980 tk.MustQuery("select @@global.MAX_EXECUTION_TIME;").Check(testkit.Rows("300")) 2981 tk.MustQuery("select @@MAX_EXECUTION_TIME;").Check(testkit.Rows("150")) 2982 2983 tk.MustInterDirc("set @@global.MAX_EXECUTION_TIME = 0;") 2984 tk.MustInterDirc("set @@MAX_EXECUTION_TIME = 0;") 2985 tk.MustInterDirc("commit") 2986 tk.MustInterDirc("drop causet if exists MaxInterDircTime;") 2987 } 2988 2989 func (s *testStochastikSuite2) TestGrantViewRelated(c *C) { 2990 tkRoot := testkit.NewTestKitWithInit(c, s.causetstore) 2991 tkUser := testkit.NewTestKitWithInit(c, s.causetstore) 2992 2993 tkRoot.Se.Auth(&auth.UserIdentity{Username: "root", Hostname: "localhost", CurrentUser: true, AuthUsername: "root", AuthHostname: "%"}, nil, []byte("012345678901234567890")) 2994 2995 tkRoot.MustInterDirc("create causet if not exists t (a int)") 2996 tkRoot.MustInterDirc("create view v_version29 as select * from t") 2997 tkRoot.MustInterDirc("create user 'u_version29'@'%'") 2998 tkRoot.MustInterDirc("grant select on t to u_version29@'%'") 2999 3000 tkUser.Se.Auth(&auth.UserIdentity{Username: "u_version29", Hostname: "localhost", CurrentUser: true, AuthUsername: "u_version29", AuthHostname: "%"}, nil, []byte("012345678901234567890")) 3001 3002 tkUser.MustQuery("select current_user();").Check(testkit.Rows("u_version29@%")) 3003 err := tkUser.InterDircToErr("select * from test.v_version29;") 3004 c.Assert(err, NotNil) 3005 tkUser.MustQuery("select current_user();").Check(testkit.Rows("u_version29@%")) 3006 err = tkUser.InterDircToErr("create view v_version29_c as select * from t;") 3007 c.Assert(err, NotNil) 3008 3009 tkRoot.MustInterDirc(`grant show view on v_version29 to 'u_version29'@'%'`) 3010 tkRoot.MustQuery("select block_priv from allegrosql.blocks_priv where host='%' and EDB='test' and user='u_version29' and block_name='v_version29'").Check(testkit.Rows("Show View")) 3011 3012 tkUser.MustQuery("select current_user();").Check(testkit.Rows("u_version29@%")) 3013 tkUser.MustQuery("show create view v_version29;") 3014 err = tkUser.InterDircToErr("create view v_version29_c as select * from v_version29;") 3015 c.Assert(err, NotNil) 3016 3017 tkRoot.MustInterDirc("create view v_version29_c as select * from v_version29;") 3018 tkRoot.MustInterDirc(`grant create view on v_version29_c to 'u_version29'@'%'`) // Can't grant privilege on a non-exist causet/view. 3019 tkRoot.MustQuery("select block_priv from allegrosql.blocks_priv where host='%' and EDB='test' and user='u_version29' and block_name='v_version29_c'").Check(testkit.Rows("Create View")) 3020 tkRoot.MustInterDirc("drop view v_version29_c") 3021 3022 tkRoot.MustInterDirc(`grant select on v_version29 to 'u_version29'@'%'`) 3023 tkUser.MustQuery("select current_user();").Check(testkit.Rows("u_version29@%")) 3024 tkUser.MustInterDirc("create view v_version29_c as select * from v_version29;") 3025 } 3026 3027 func (s *testStochastikSuite3) TestLoadClientInteractive(c *C) { 3028 var ( 3029 err error 3030 connectionID uint64 3031 ) 3032 tk := testkit.NewTestKit(c, s.causetstore) 3033 tk.Se, err = stochastik.CreateStochastik4Test(s.causetstore) 3034 c.Assert(err, IsNil) 3035 id := atomic.AddUint64(&connectionID, 1) 3036 tk.Se.SetConnectionID(id) 3037 tk.Se.GetStochastikVars().ClientCapability = tk.Se.GetStochastikVars().ClientCapability | allegrosql.ClientInteractive 3038 tk.MustQuery("select @@wait_timeout").Check(testkit.Rows("28800")) 3039 } 3040 3041 func (s *testStochastikSuite2) TestReplicaRead(c *C) { 3042 var err error 3043 tk := testkit.NewTestKit(c, s.causetstore) 3044 tk.Se, err = stochastik.CreateStochastik4Test(s.causetstore) 3045 c.Assert(err, IsNil) 3046 c.Assert(tk.Se.GetStochastikVars().GetReplicaRead(), Equals, ekv.ReplicaReadLeader) 3047 tk.MustInterDirc("set @@milevadb_replica_read = 'follower';") 3048 c.Assert(tk.Se.GetStochastikVars().GetReplicaRead(), Equals, ekv.ReplicaReadFollower) 3049 tk.MustInterDirc("set @@milevadb_replica_read = 'leader';") 3050 c.Assert(tk.Se.GetStochastikVars().GetReplicaRead(), Equals, ekv.ReplicaReadLeader) 3051 } 3052 3053 func (s *testStochastikSuite3) TestIsolationRead(c *C) { 3054 var err error 3055 tk := testkit.NewTestKit(c, s.causetstore) 3056 tk.Se, err = stochastik.CreateStochastik4Test(s.causetstore) 3057 c.Assert(err, IsNil) 3058 c.Assert(len(tk.Se.GetStochastikVars().GetIsolationReadEngines()), Equals, 3) 3059 tk.MustInterDirc("set @@milevadb_isolation_read_engines = 'tiflash';") 3060 engines := tk.Se.GetStochastikVars().GetIsolationReadEngines() 3061 c.Assert(len(engines), Equals, 1) 3062 _, hasTiFlash := engines[ekv.TiFlash] 3063 _, hasEinsteinDB := engines[ekv.EinsteinDB] 3064 c.Assert(hasTiFlash, Equals, true) 3065 c.Assert(hasEinsteinDB, Equals, false) 3066 } 3067 3068 func (s *testStochastikSuite2) TestStmtHints(c *C) { 3069 var err error 3070 tk := testkit.NewTestKit(c, s.causetstore) 3071 tk.Se, err = stochastik.CreateStochastik4Test(s.causetstore) 3072 c.Assert(err, IsNil) 3073 3074 // Test MEMORY_QUOTA hint 3075 tk.MustInterDirc("select /*+ MEMORY_QUOTA(1 MB) */ 1;") 3076 val := int64(1) * 1024 * 1024 3077 c.Assert(tk.Se.GetStochastikVars().StmtCtx.MemTracker.CheckBytesLimit(val), IsTrue) 3078 tk.MustInterDirc("select /*+ MEMORY_QUOTA(1 GB) */ 1;") 3079 val = int64(1) * 1024 * 1024 * 1024 3080 c.Assert(tk.Se.GetStochastikVars().StmtCtx.MemTracker.CheckBytesLimit(val), IsTrue) 3081 tk.MustInterDirc("select /*+ MEMORY_QUOTA(1 GB), MEMORY_QUOTA(1 MB) */ 1;") 3082 val = int64(1) * 1024 * 1024 3083 c.Assert(tk.Se.GetStochastikVars().StmtCtx.GetWarnings(), HasLen, 1) 3084 c.Assert(tk.Se.GetStochastikVars().StmtCtx.MemTracker.CheckBytesLimit(val), IsTrue) 3085 tk.MustInterDirc("select /*+ MEMORY_QUOTA(0 GB) */ 1;") 3086 val = int64(0) 3087 c.Assert(tk.Se.GetStochastikVars().StmtCtx.GetWarnings(), HasLen, 1) 3088 c.Assert(tk.Se.GetStochastikVars().StmtCtx.MemTracker.CheckBytesLimit(val), IsTrue) 3089 c.Assert(tk.Se.GetStochastikVars().StmtCtx.GetWarnings()[0].Err.Error(), Equals, "Setting the MEMORY_QUOTA to 0 means no memory limit") 3090 3091 tk.MustInterDirc("use test") 3092 tk.MustInterDirc("create causet t1(a int);") 3093 tk.MustInterDirc("insert /*+ MEMORY_QUOTA(1 MB) */ into t1 (a) values (1);") 3094 val = int64(1) * 1024 * 1024 3095 c.Assert(tk.Se.GetStochastikVars().StmtCtx.MemTracker.CheckBytesLimit(val), IsTrue) 3096 3097 tk.MustInterDirc("insert /*+ MEMORY_QUOTA(1 MB) */ into t1 select /*+ MEMORY_QUOTA(3 MB) */ * from t1;") 3098 val = int64(1) * 1024 * 1024 3099 c.Assert(tk.Se.GetStochastikVars().StmtCtx.MemTracker.CheckBytesLimit(val), IsTrue) 3100 c.Assert(tk.Se.GetStochastikVars().StmtCtx.GetWarnings(), HasLen, 1) 3101 c.Assert(tk.Se.GetStochastikVars().StmtCtx.GetWarnings()[0].Err.Error(), Equals, "[soliton:3126]Hint MEMORY_QUOTA(`3145728`) is ignored as conflicting/duplicated.") 3102 3103 // Test NO_INDEX_MERGE hint 3104 tk.Se.GetStochastikVars().SetEnableIndexMerge(true) 3105 tk.MustInterDirc("select /*+ NO_INDEX_MERGE() */ 1;") 3106 c.Assert(tk.Se.GetStochastikVars().StmtCtx.NoIndexMergeHint, IsTrue) 3107 tk.MustInterDirc("select /*+ NO_INDEX_MERGE(), NO_INDEX_MERGE() */ 1;") 3108 c.Assert(tk.Se.GetStochastikVars().StmtCtx.GetWarnings(), HasLen, 1) 3109 c.Assert(tk.Se.GetStochastikVars().GetEnableIndexMerge(), IsTrue) 3110 3111 // Test USE_TOJA hint 3112 tk.Se.GetStochastikVars().SetAllowInSubqToJoinAnPosetDagg(true) 3113 tk.MustInterDirc("select /*+ USE_TOJA(false) */ 1;") 3114 c.Assert(tk.Se.GetStochastikVars().GetAllowInSubqToJoinAnPosetDagg(), IsFalse) 3115 tk.Se.GetStochastikVars().SetAllowInSubqToJoinAnPosetDagg(false) 3116 tk.MustInterDirc("select /*+ USE_TOJA(true) */ 1;") 3117 c.Assert(tk.Se.GetStochastikVars().GetAllowInSubqToJoinAnPosetDagg(), IsTrue) 3118 tk.MustInterDirc("select /*+ USE_TOJA(false), USE_TOJA(true) */ 1;") 3119 c.Assert(tk.Se.GetStochastikVars().StmtCtx.GetWarnings(), HasLen, 1) 3120 c.Assert(tk.Se.GetStochastikVars().GetAllowInSubqToJoinAnPosetDagg(), IsTrue) 3121 3122 // Test USE_CASCADES hint 3123 tk.Se.GetStochastikVars().SetEnableCascadesCausetAppend(true) 3124 tk.MustInterDirc("select /*+ USE_CASCADES(false) */ 1;") 3125 c.Assert(tk.Se.GetStochastikVars().GetEnableCascadesCausetAppend(), IsFalse) 3126 tk.Se.GetStochastikVars().SetEnableCascadesCausetAppend(false) 3127 tk.MustInterDirc("select /*+ USE_CASCADES(true) */ 1;") 3128 c.Assert(tk.Se.GetStochastikVars().GetEnableCascadesCausetAppend(), IsTrue) 3129 tk.MustInterDirc("select /*+ USE_CASCADES(false), USE_CASCADES(true) */ 1;") 3130 c.Assert(tk.Se.GetStochastikVars().StmtCtx.GetWarnings(), HasLen, 1) 3131 c.Assert(tk.Se.GetStochastikVars().StmtCtx.GetWarnings()[0].Err.Error(), Equals, "USE_CASCADES() is defined more than once, only the last definition takes effect: USE_CASCADES(true)") 3132 c.Assert(tk.Se.GetStochastikVars().GetEnableCascadesCausetAppend(), IsTrue) 3133 3134 // Test READ_CONSISTENT_REPLICA hint 3135 tk.Se.GetStochastikVars().SetReplicaRead(ekv.ReplicaReadLeader) 3136 tk.MustInterDirc("select /*+ READ_CONSISTENT_REPLICA() */ 1;") 3137 c.Assert(tk.Se.GetStochastikVars().GetReplicaRead(), Equals, ekv.ReplicaReadFollower) 3138 tk.MustInterDirc("select /*+ READ_CONSISTENT_REPLICA(), READ_CONSISTENT_REPLICA() */ 1;") 3139 c.Assert(tk.Se.GetStochastikVars().StmtCtx.GetWarnings(), HasLen, 1) 3140 c.Assert(tk.Se.GetStochastikVars().GetReplicaRead(), Equals, ekv.ReplicaReadFollower) 3141 } 3142 3143 func (s *testStochastikSuite3) TestPessimisticLockOnPartition(c *C) { 3144 // This test checks that 'select ... for uFIDelate' locks the partition instead of the causet. 3145 // Cover a bug that causet ID is used to encode the dagger key mistakenly. 3146 tk := testkit.NewTestKit(c, s.causetstore) 3147 tk.MustInterDirc("use test") 3148 tk.MustInterDirc(`create causet if not exists foruFIDelate_on_partition ( 3149 age int not null primary key, 3150 nickname varchar(20) not null, 3151 gender int not null default 0, 3152 first_name varchar(30) not null default '', 3153 last_name varchar(20) not null default '', 3154 full_name varchar(60) as (concat(first_name, ' ', last_name)), 3155 index idx_nickname (nickname) 3156 ) partition by range (age) ( 3157 partition child values less than (18), 3158 partition young values less than (30), 3159 partition midbse values less than (50), 3160 partition old values less than (123) 3161 );`) 3162 tk.MustInterDirc("insert into foruFIDelate_on_partition (`age`, `nickname`) values (25, 'cosven');") 3163 3164 tk1 := testkit.NewTestKit(c, s.causetstore) 3165 tk1.MustInterDirc("use test") 3166 3167 tk.MustInterDirc("begin pessimistic") 3168 tk.MustQuery("select * from foruFIDelate_on_partition where age=25 for uFIDelate").Check(testkit.Rows("25 cosven 0 ")) 3169 tk1.MustInterDirc("begin pessimistic") 3170 3171 ch := make(chan int32, 5) 3172 go func() { 3173 tk1.MustInterDirc("uFIDelate foruFIDelate_on_partition set first_name='sw' where age=25") 3174 ch <- 0 3175 tk1.MustInterDirc("commit") 3176 ch <- 0 3177 }() 3178 3179 // Leave 50ms for tk1 to run, tk1 should be blocked at the uFIDelate operation. 3180 time.Sleep(50 * time.Millisecond) 3181 ch <- 1 3182 3183 tk.MustInterDirc("commit") 3184 // tk1 should be blocked until tk commit, check the order. 3185 c.Assert(<-ch, Equals, int32(1)) 3186 c.Assert(<-ch, Equals, int32(0)) 3187 <-ch // wait for goroutine to quit. 3188 3189 // Once again... 3190 // This time, test for the uFIDelate-uFIDelate conflict. 3191 tk.MustInterDirc("begin pessimistic") 3192 tk.MustInterDirc("uFIDelate foruFIDelate_on_partition set first_name='sw' where age=25") 3193 tk1.MustInterDirc("begin pessimistic") 3194 3195 go func() { 3196 tk1.MustInterDirc("uFIDelate foruFIDelate_on_partition set first_name = 'xxx' where age=25") 3197 ch <- 0 3198 tk1.MustInterDirc("commit") 3199 ch <- 0 3200 }() 3201 3202 // Leave 50ms for tk1 to run, tk1 should be blocked at the uFIDelate operation. 3203 time.Sleep(50 * time.Millisecond) 3204 ch <- 1 3205 3206 tk.MustInterDirc("commit") 3207 // tk1 should be blocked until tk commit, check the order. 3208 c.Assert(<-ch, Equals, int32(1)) 3209 c.Assert(<-ch, Equals, int32(0)) 3210 <-ch // wait for goroutine to quit. 3211 } 3212 3213 func (s *testSchemaSuite) TestTxnSize(c *C) { 3214 tk := testkit.NewTestKitWithInit(c, s.causetstore) 3215 tk.MustInterDirc("drop causet if exists txn_size") 3216 tk.MustInterDirc("create causet txn_size (k int , v varchar(64))") 3217 tk.MustInterDirc("begin") 3218 tk.MustInterDirc("insert txn_size values (1, 'dfaasdfsdf')") 3219 tk.MustInterDirc("insert txn_size values (2, 'dsdfaasdfsdf')") 3220 tk.MustInterDirc("insert txn_size values (3, 'abcdefghijkl')") 3221 txn, err := tk.Se.Txn(false) 3222 c.Assert(err, IsNil) 3223 c.Assert(txn.Size() > 0, IsTrue) 3224 } 3225 3226 func (s *testStochastikSuite2) TestPerStmtTaskID(c *C) { 3227 tk := testkit.NewTestKitWithInit(c, s.causetstore) 3228 tk.MustInterDirc("create causet task_id (v int)") 3229 3230 tk.MustInterDirc("begin") 3231 tk.MustInterDirc("select * from task_id where v > 10") 3232 taskID1 := tk.Se.GetStochastikVars().StmtCtx.TaskID 3233 tk.MustInterDirc("select * from task_id where v < 5") 3234 taskID2 := tk.Se.GetStochastikVars().StmtCtx.TaskID 3235 tk.MustInterDirc("commit") 3236 3237 c.Assert(taskID1 != taskID2, IsTrue) 3238 } 3239 3240 func (s *testStochastikSerialSuite) TestDoDBSJobQuit(c *C) { 3241 // test https://github.com/whtcorpsinc/milevadb/issues/18714, imitate DM's use environment 3242 // use isolated causetstore, because in below failpoint we will cancel its context 3243 causetstore, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.MockEinsteinDB)) 3244 c.Assert(err, IsNil) 3245 defer causetstore.Close() 3246 dom, err := stochastik.BootstrapStochastik(causetstore) 3247 c.Assert(err, IsNil) 3248 defer dom.Close() 3249 se, err := stochastik.CreateStochastik(causetstore) 3250 c.Assert(err, IsNil) 3251 defer se.Close() 3252 3253 c.Assert(failpoint.Enable("github.com/whtcorpsinc/milevadb/dbs/storeCloseInLoop", `return`), IsNil) 3254 defer failpoint.Disable("github.com/whtcorpsinc/milevadb/dbs/storeCloseInLoop") 3255 3256 // this DBS call will enter deadloop before this fix 3257 err = dom.DBS().CreateSchema(se, perceptron.NewCIStr("testschema"), nil) 3258 c.Assert(err.Error(), Equals, "context canceled") 3259 } 3260 3261 func (s *testBackupRestoreSuite) TestBackupAndRestore(c *C) { 3262 // only run BR ALLEGROALLEGROSQL integration test with einsteindb causetstore. 3263 if *withEinsteinDB { 3264 cfg := config.GetGlobalConfig() 3265 cfg.CausetStore = "einsteindb" 3266 cfg.Path = s.FIDelAddr 3267 config.StoreGlobalConfig(cfg) 3268 tk := testkit.NewTestKitWithInit(c, s.causetstore) 3269 tk.MustInterDirc("create database if not exists br") 3270 tk.MustInterDirc("use br") 3271 tk.MustInterDirc("create causet t1(v int)") 3272 tk.MustInterDirc("insert into t1 values (1)") 3273 tk.MustInterDirc("insert into t1 values (2)") 3274 tk.MustInterDirc("insert into t1 values (3)") 3275 tk.MustQuery("select count(*) from t1").Check(testkit.Rows("3")) 3276 3277 tk.MustInterDirc("create database if not exists br02") 3278 tk.MustInterDirc("use br02") 3279 tk.MustInterDirc("create causet t1(v int)") 3280 3281 tmFIDelir := path.Join(os.TemFIDelir(), "bk1") 3282 os.RemoveAll(tmFIDelir) 3283 // backup database to tmp dir 3284 tk.MustQuery("backup database * to 'local://" + tmFIDelir + "'") 3285 3286 // remove database for recovery 3287 tk.MustInterDirc("drop database br") 3288 tk.MustInterDirc("drop database br02") 3289 3290 // restore database with backup data 3291 tk.MustQuery("restore database * from 'local://" + tmFIDelir + "'") 3292 tk.MustInterDirc("use br") 3293 tk.MustQuery("select count(*) from t1").Check(testkit.Rows("3")) 3294 tk.MustInterDirc("drop database br") 3295 tk.MustInterDirc("drop database br02") 3296 } 3297 }