@@ -48,6 +48,7 @@ func (s *testStateChangeSuite) SetUpSuite(c *C) {
48
48
s .store , err = tikv .NewMockTikvStore ()
49
49
c .Assert (err , IsNil )
50
50
tidb .SetSchemaLease (s .lease )
51
+ tidb .SetStatsLease (0 )
51
52
s .dom , err = tidb .BootstrapSession (s .store )
52
53
c .Assert (err , IsNil )
53
54
s .se , err = tidb .CreateSession (s .store )
@@ -281,3 +282,61 @@ func (t *testExecInfo) execSQL(idx int) error {
281
282
}
282
283
return nil
283
284
}
285
+
286
+ // TestUpdateOrDelete tests whether the correct columns is used in PhysicalIndexScan's ToPB function.
287
+ func (s * testStateChangeSuite ) TestUpdateOrDelete (c * C ) {
288
+ sqls := make ([]string , 2 )
289
+ sqls [0 ] = "delete from t where c2 = 'a'"
290
+ sqls [1 ] = "update t use index(c2) set c2 = 'c2_update' where c2 = 'a'"
291
+ alterTableSQL := "alter table t add column a int not null default 1 first"
292
+ s .runTestInWriteOnly (c , "" , alterTableSQL , sqls )
293
+ }
294
+
295
+ func (s * testStateChangeSuite ) runTestInWriteOnly (c * C , tableName , alterTableSQL string , sqls []string ) {
296
+ defer testleak .AfterTest (c )()
297
+ _ , err := s .se .Execute (`create table t (
298
+ c1 int primary key,
299
+ c2 varchar(64),
300
+ c3 enum('N','Y') not null default 'N',
301
+ c4 timestamp on update current_timestamp,
302
+ key(c2))` )
303
+ c .Assert (err , IsNil )
304
+ defer s .se .Execute ("drop table t" )
305
+ _ , err = s .se .Execute ("insert into t values(8, 'a', 'N', '2017-07-01')" )
306
+ c .Assert (err , IsNil )
307
+ // Make sure these sqls use the the plan of index scan.
308
+ _ , err = s .se .Execute ("drop stats t" )
309
+ c .Assert (err , IsNil )
310
+
311
+ callback := & ddl.TestDDLCallback {}
312
+ prevState := model .StateNone
313
+ var checkErr error
314
+ times := 0
315
+ se , err := tidb .CreateSession (s .store )
316
+ c .Assert (err , IsNil )
317
+ _ , err = se .Execute ("use test_db_state" )
318
+ c .Assert (err , IsNil )
319
+ callback .OnJobUpdatedExported = func (job * model.Job ) {
320
+ if job .SchemaState == prevState || checkErr != nil || times >= 3 {
321
+ return
322
+ }
323
+ times ++
324
+ if job .SchemaState != model .StateWriteOnly {
325
+ return
326
+ }
327
+ for _ , sql := range sqls {
328
+ _ , err = se .Execute (sql )
329
+ if err != nil {
330
+ checkErr = err
331
+ break
332
+ }
333
+ }
334
+ }
335
+ d := s .dom .DDL ()
336
+ d .SetHook (callback )
337
+ _ , err = s .se .Execute (alterTableSQL )
338
+ c .Assert (err , IsNil )
339
+ c .Assert (errors .ErrorStack (checkErr ), Equals , "" )
340
+ callback = & ddl.TestDDLCallback {}
341
+ d .SetHook (callback )
342
+ }
0 commit comments