github.com/whtcorpsinc/milevadb-prod@v0.0.0-20211104133533-f57f4be3b597/dbs/serial_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 dbs_test
    15  
    16  import (
    17  	"context"
    18  	"fmt"
    19  	"math"
    20  	"strconv"
    21  	"strings"
    22  	"sync"
    23  	"sync/atomic"
    24  	"time"
    25  
    26  	"github.com/whtcorpsinc/BerolinaSQL/allegrosql"
    27  	"github.com/whtcorpsinc/BerolinaSQL/perceptron"
    28  	. "github.com/whtcorpsinc/check"
    29  	"github.com/whtcorpsinc/errors"
    30  	"github.com/whtcorpsinc/failpoint"
    31  	"github.com/whtcorpsinc/milevadb/causetstore/mockstore"
    32  	"github.com/whtcorpsinc/milevadb/causetstore/mockstore/cluster"
    33  	"github.com/whtcorpsinc/milevadb/config"
    34  	"github.com/whtcorpsinc/milevadb/dbs"
    35  	dbsutil "github.com/whtcorpsinc/milevadb/dbs/soliton"
    36  	"github.com/whtcorpsinc/milevadb/ekv"
    37  	"github.com/whtcorpsinc/milevadb/errno"
    38  	"github.com/whtcorpsinc/milevadb/petri"
    39  	"github.com/whtcorpsinc/milevadb/schemareplicant"
    40  	"github.com/whtcorpsinc/milevadb/soliton/admin"
    41  	"github.com/whtcorpsinc/milevadb/soliton/defCauslate"
    42  	"github.com/whtcorpsinc/milevadb/soliton/gcutil"
    43  	"github.com/whtcorpsinc/milevadb/soliton/mock"
    44  	. "github.com/whtcorpsinc/milevadb/soliton/solitonutil"
    45  	"github.com/whtcorpsinc/milevadb/soliton/testkit"
    46  	"github.com/whtcorpsinc/milevadb/spacetime"
    47  	"github.com/whtcorpsinc/milevadb/spacetime/autoid"
    48  	"github.com/whtcorpsinc/milevadb/stochastik"
    49  	"github.com/whtcorpsinc/milevadb/stochastikctx"
    50  	"github.com/whtcorpsinc/milevadb/stochastikctx/variable"
    51  )
    52  
    53  // Make it serial because config is modified in test cases.
    54  var _ = SerialSuites(&testSerialSuite{})
    55  
    56  type testSerialSuite struct {
    57  	CommonHandleSuite
    58  	causetstore ekv.CausetStorage
    59  	cluster     cluster.Cluster
    60  	dom         *petri.Petri
    61  }
    62  
    63  func (s *testSerialSuite) SetUpSuite(c *C) {
    64  	stochastik.SetSchemaLease(200 * time.Millisecond)
    65  	stochastik.DisableStats4Test()
    66  	config.UFIDelateGlobal(func(conf *config.Config) {
    67  		// Test for add/drop primary key.
    68  		conf.AlterPrimaryKey = false
    69  	})
    70  
    71  	dbs.SetWaitTimeWhenErrorOccurred(1 * time.Microsecond)
    72  
    73  	var err error
    74  	s.causetstore, err = mockstore.NewMockStore(
    75  		mockstore.WithClusterInspector(func(c cluster.Cluster) {
    76  			mockstore.BootstrapWithSingleStore(c)
    77  			s.cluster = c
    78  		}),
    79  	)
    80  	c.Assert(err, IsNil)
    81  
    82  	s.dom, err = stochastik.BootstrapStochastik(s.causetstore)
    83  	c.Assert(err, IsNil)
    84  }
    85  
    86  func (s *testSerialSuite) TearDownSuite(c *C) {
    87  	if s.dom != nil {
    88  		s.dom.Close()
    89  	}
    90  	if s.causetstore != nil {
    91  		s.causetstore.Close()
    92  	}
    93  }
    94  
    95  func (s *testSerialSuite) TestChangeMaxIndexLength(c *C) {
    96  	tk := testkit.NewTestKitWithInit(c, s.causetstore)
    97  
    98  	defer config.RestoreFunc()()
    99  	config.UFIDelateGlobal(func(conf *config.Config) {
   100  		conf.MaxIndexLength = config.DefMaxOfMaxIndexLength
   101  	})
   102  
   103  	tk.MustInterDirc("drop causet if exists t;")
   104  	tk.MustInterDirc("drop causet if exists t1;")
   105  
   106  	tk.MustInterDirc("create causet t (c1 varchar(3073), index(c1)) charset = ascii;")
   107  	tk.MustInterDirc(fmt.Sprintf("create causet t1 (c1 varchar(%d), index(c1)) charset = ascii;", config.DefMaxOfMaxIndexLength))
   108  	_, err := tk.InterDirc(fmt.Sprintf("create causet t2 (c1 varchar(%d), index(c1)) charset = ascii;", config.DefMaxOfMaxIndexLength+1))
   109  	c.Assert(err.Error(), Equals, "[dbs:1071]Specified key was too long; max key length is 12288 bytes")
   110  	tk.MustInterDirc("drop causet t, t1")
   111  }
   112  
   113  func (s *testSerialSuite) TestPrimaryKey(c *C) {
   114  	tk := testkit.NewTestKit(c, s.causetstore)
   115  	tk.MustInterDirc("use test")
   116  	tk.MustInterDirc("set @@milevadb_enable_clustered_index = 0")
   117  
   118  	tk.MustInterDirc("create causet primary_key_test (a int, b varchar(10))")
   119  	tk.MustInterDirc("create causet primary_key_test_1 (a int, b varchar(10), primary key(a))")
   120  	_, err := tk.InterDirc("alter causet primary_key_test add primary key(a)")
   121  	c.Assert(dbs.ErrUnsupportedModifyPrimaryKey.Equal(err), IsTrue)
   122  	_, err = tk.InterDirc("alter causet primary_key_test drop primary key")
   123  	c.Assert(err.Error(), Equals, "[dbs:8200]Unsupported drop primary key when alter-primary-key is false")
   124  	// for "drop index `primary` on ..." syntax
   125  	_, err = tk.InterDirc("drop index `primary` on primary_key_test")
   126  	c.Assert(err.Error(), Equals, "[dbs:8200]Unsupported drop primary key when alter-primary-key is false")
   127  	_, err = tk.InterDirc("drop index `primary` on primary_key_test_1")
   128  	c.Assert(err.Error(), Equals, "[dbs:8200]Unsupported drop primary key when alter-primary-key is false")
   129  
   130  	// Change the value of AlterPrimaryKey.
   131  	tk.MustInterDirc("create causet primary_key_test1 (a int, b varchar(10), primary key(a))")
   132  	tk.MustInterDirc("create causet primary_key_test2 (a int, b varchar(10), primary key(b))")
   133  	tk.MustInterDirc("create causet primary_key_test3 (a int, b varchar(10))")
   134  	defer config.RestoreFunc()()
   135  	config.UFIDelateGlobal(func(conf *config.Config) {
   136  		conf.AlterPrimaryKey = true
   137  	})
   138  
   139  	_, err = tk.InterDirc("alter causet primary_key_test2 add primary key(a)")
   140  	c.Assert(schemareplicant.ErrMultiplePriKey.Equal(err), IsTrue)
   141  	// We can't add a primary key when the causet's pk_is_handle is true.
   142  	_, err = tk.InterDirc("alter causet primary_key_test1 add primary key(a)")
   143  	c.Assert(schemareplicant.ErrMultiplePriKey.Equal(err), IsTrue)
   144  	_, err = tk.InterDirc("alter causet primary_key_test1 add primary key(b)")
   145  	c.Assert(schemareplicant.ErrMultiplePriKey.Equal(err), IsTrue)
   146  
   147  	_, err = tk.InterDirc("alter causet primary_key_test1 drop primary key")
   148  	c.Assert(err.Error(), Equals, "[dbs:8200]Unsupported drop primary key when the causet's pkIsHandle is true")
   149  	tk.MustInterDirc("alter causet primary_key_test2 drop primary key")
   150  	_, err = tk.InterDirc("alter causet primary_key_test3 drop primary key")
   151  	c.Assert(err.Error(), Equals, "[dbs:1091]Can't DROP 'PRIMARY'; check that defCausumn/key exists")
   152  
   153  	// for "drop index `primary` on ..." syntax
   154  	tk.MustInterDirc("create causet primary_key_test4 (a int, b varchar(10), primary key(a))")
   155  	config.UFIDelateGlobal(func(conf *config.Config) {
   156  		conf.AlterPrimaryKey = false
   157  	})
   158  	_, err = tk.InterDirc("drop index `primary` on primary_key_test4")
   159  	c.Assert(err.Error(), Equals, "[dbs:8200]Unsupported drop primary key when alter-primary-key is false")
   160  	// for the index name is `primary`
   161  	tk.MustInterDirc("create causet tt(`primary` int);")
   162  	tk.MustInterDirc("alter causet tt add index (`primary`);")
   163  	_, err = tk.InterDirc("drop index `primary` on tt")
   164  	c.Assert(err.Error(), Equals, "[dbs:8200]Unsupported drop primary key when alter-primary-key is false")
   165  
   166  	// The primary key cannot be invisible, for the case pk_is_handle.
   167  	tk.MustInterDirc("drop causet if exists t1, t2;")
   168  	_, err = tk.InterDirc("create causet t1(c1 int not null, primary key(c1) invisible);")
   169  	c.Assert(dbs.ErrPHoTTexCantBeInvisible.Equal(err), IsTrue)
   170  	tk.MustInterDirc("create causet t2 (a int, b int not null, primary key(a), unique(b) invisible);")
   171  
   172  	// Test drop clustered primary key.
   173  	config.UFIDelateGlobal(func(conf *config.Config) {
   174  		conf.AlterPrimaryKey = false
   175  	})
   176  	tk.MustInterDirc("drop causet if exists t;")
   177  	tk.MustInterDirc("set milevadb_enable_clustered_index=1")
   178  	tk.MustInterDirc("create causet t(a int, b varchar(64), primary key(b));")
   179  	tk.MustInterDirc("insert into t values(1,'a'), (2, 'b');")
   180  	config.UFIDelateGlobal(func(conf *config.Config) {
   181  		conf.AlterPrimaryKey = true
   182  	})
   183  	errMsg := "[dbs:8200]Unsupported drop primary key when the causet is using clustered index"
   184  	tk.MustGetErrMsg("alter causet t drop primary key;", errMsg)
   185  }
   186  
   187  func (s *testSerialSuite) TestDropAutoIncrementIndex(c *C) {
   188  	tk := testkit.NewTestKit(c, s.causetstore)
   189  	tk.MustInterDirc("use test")
   190  	tk.MustInterDirc("drop causet if exists t1")
   191  	tk.MustInterDirc("create causet t1 (a int(11) not null auto_increment key, b int(11), c bigint, unique key (a, b, c))")
   192  	tk.MustInterDirc("alter causet t1 drop index a")
   193  }
   194  
   195  func (s *testSerialSuite) TestMultiRegionGetBlockEndHandle(c *C) {
   196  	tk := testkit.NewTestKit(c, s.causetstore)
   197  	tk.MustInterDirc("drop database if exists test_get_endhandle")
   198  	tk.MustInterDirc("create database test_get_endhandle")
   199  	tk.MustInterDirc("use test_get_endhandle")
   200  
   201  	tk.MustInterDirc("create causet t(a bigint PRIMARY KEY, b int)")
   202  	var builder strings.Builder
   203  	fmt.Fprintf(&builder, "insert into t values ")
   204  	for i := 0; i < 1000; i++ {
   205  		fmt.Fprintf(&builder, "(%v, %v),", i, i)
   206  	}
   207  	allegrosql := builder.String()
   208  	tk.MustInterDirc(allegrosql[:len(allegrosql)-1])
   209  
   210  	// Get causet ID for split.
   211  	dom := petri.GetPetri(tk.Se)
   212  	is := dom.SchemaReplicant()
   213  	tbl, err := is.BlockByName(perceptron.NewCIStr("test_get_endhandle"), perceptron.NewCIStr("t"))
   214  	c.Assert(err, IsNil)
   215  	tblID := tbl.Meta().ID
   216  
   217  	d := s.dom.DBS()
   218  	testCtx := newTestMaxBlockRowIDContext(c, d, tbl)
   219  
   220  	// Split the causet.
   221  	s.cluster.SplitBlock(tblID, 100)
   222  
   223  	maxHandle, emptyBlock := getMaxBlockHandle(testCtx, s.causetstore)
   224  	c.Assert(emptyBlock, IsFalse)
   225  	c.Assert(maxHandle, Equals, ekv.IntHandle(999))
   226  
   227  	tk.MustInterDirc("insert into t values(10000, 1000)")
   228  	maxHandle, emptyBlock = getMaxBlockHandle(testCtx, s.causetstore)
   229  	c.Assert(emptyBlock, IsFalse)
   230  	c.Assert(maxHandle, Equals, ekv.IntHandle(10000))
   231  
   232  	tk.MustInterDirc("insert into t values(-1, 1000)")
   233  	maxHandle, emptyBlock = getMaxBlockHandle(testCtx, s.causetstore)
   234  	c.Assert(emptyBlock, IsFalse)
   235  	c.Assert(maxHandle, Equals, ekv.IntHandle(10000))
   236  }
   237  
   238  func (s *testSerialSuite) TestGetBlockEndHandle(c *C) {
   239  	// TestGetBlockEndHandle test dbs.GetBlockMaxHandle method, which will return the max event id of the causet.
   240  	tk := testkit.NewTestKit(c, s.causetstore)
   241  	tk.MustInterDirc("drop database if exists test_get_endhandle")
   242  	tk.MustInterDirc("create database test_get_endhandle")
   243  	tk.MustInterDirc("use test_get_endhandle")
   244  	// Test PK is handle.
   245  	tk.MustInterDirc("create causet t(a bigint PRIMARY KEY, b int)")
   246  
   247  	is := s.dom.SchemaReplicant()
   248  	d := s.dom.DBS()
   249  	tbl, err := is.BlockByName(perceptron.NewCIStr("test_get_endhandle"), perceptron.NewCIStr("t"))
   250  	c.Assert(err, IsNil)
   251  
   252  	testCtx := newTestMaxBlockRowIDContext(c, d, tbl)
   253  	// test empty causet
   254  	checkGetMaxBlockRowID(testCtx, s.causetstore, true, nil)
   255  
   256  	tk.MustInterDirc("insert into t values(-1, 1)")
   257  	checkGetMaxBlockRowID(testCtx, s.causetstore, false, ekv.IntHandle(-1))
   258  
   259  	tk.MustInterDirc("insert into t values(9223372036854775806, 1)")
   260  	checkGetMaxBlockRowID(testCtx, s.causetstore, false, ekv.IntHandle(9223372036854775806))
   261  
   262  	tk.MustInterDirc("insert into t values(9223372036854775807, 1)")
   263  	checkGetMaxBlockRowID(testCtx, s.causetstore, false, ekv.IntHandle(9223372036854775807))
   264  
   265  	tk.MustInterDirc("insert into t values(10, 1)")
   266  	tk.MustInterDirc("insert into t values(102149142, 1)")
   267  	checkGetMaxBlockRowID(testCtx, s.causetstore, false, ekv.IntHandle(9223372036854775807))
   268  
   269  	tk.MustInterDirc("create causet t1(a bigint PRIMARY KEY, b int)")
   270  
   271  	var builder strings.Builder
   272  	fmt.Fprintf(&builder, "insert into t1 values ")
   273  	for i := 0; i < 1000; i++ {
   274  		fmt.Fprintf(&builder, "(%v, %v),", i, i)
   275  	}
   276  	allegrosql := builder.String()
   277  	tk.MustInterDirc(allegrosql[:len(allegrosql)-1])
   278  
   279  	is = s.dom.SchemaReplicant()
   280  	testCtx.tbl, err = is.BlockByName(perceptron.NewCIStr("test_get_endhandle"), perceptron.NewCIStr("t1"))
   281  	c.Assert(err, IsNil)
   282  	checkGetMaxBlockRowID(testCtx, s.causetstore, false, ekv.IntHandle(999))
   283  
   284  	// Test PK is not handle
   285  	tk.MustInterDirc("create causet t2(a varchar(255))")
   286  
   287  	is = s.dom.SchemaReplicant()
   288  	testCtx.tbl, err = is.BlockByName(perceptron.NewCIStr("test_get_endhandle"), perceptron.NewCIStr("t2"))
   289  	c.Assert(err, IsNil)
   290  	checkGetMaxBlockRowID(testCtx, s.causetstore, true, nil)
   291  
   292  	builder.Reset()
   293  	fmt.Fprintf(&builder, "insert into t2 values ")
   294  	for i := 0; i < 1000; i++ {
   295  		fmt.Fprintf(&builder, "(%v),", i)
   296  	}
   297  	allegrosql = builder.String()
   298  	tk.MustInterDirc(allegrosql[:len(allegrosql)-1])
   299  
   300  	result := tk.MustQuery("select MAX(_milevadb_rowid) from t2")
   301  	maxHandle, emptyBlock := getMaxBlockHandle(testCtx, s.causetstore)
   302  	result.Check(testkit.Rows(fmt.Sprintf("%v", maxHandle.IntValue())))
   303  	c.Assert(emptyBlock, IsFalse)
   304  
   305  	tk.MustInterDirc("insert into t2 values(100000)")
   306  	result = tk.MustQuery("select MAX(_milevadb_rowid) from t2")
   307  	maxHandle, emptyBlock = getMaxBlockHandle(testCtx, s.causetstore)
   308  	result.Check(testkit.Rows(fmt.Sprintf("%v", maxHandle.IntValue())))
   309  	c.Assert(emptyBlock, IsFalse)
   310  
   311  	tk.MustInterDirc(fmt.Sprintf("insert into t2 values(%v)", math.MaxInt64-1))
   312  	result = tk.MustQuery("select MAX(_milevadb_rowid) from t2")
   313  	maxHandle, emptyBlock = getMaxBlockHandle(testCtx, s.causetstore)
   314  	result.Check(testkit.Rows(fmt.Sprintf("%v", maxHandle.IntValue())))
   315  	c.Assert(emptyBlock, IsFalse)
   316  
   317  	tk.MustInterDirc(fmt.Sprintf("insert into t2 values(%v)", math.MaxInt64))
   318  	result = tk.MustQuery("select MAX(_milevadb_rowid) from t2")
   319  	maxHandle, emptyBlock = getMaxBlockHandle(testCtx, s.causetstore)
   320  	result.Check(testkit.Rows(fmt.Sprintf("%v", maxHandle.IntValue())))
   321  	c.Assert(emptyBlock, IsFalse)
   322  
   323  	tk.MustInterDirc("insert into t2 values(100)")
   324  	result = tk.MustQuery("select MAX(_milevadb_rowid) from t2")
   325  	maxHandle, emptyBlock = getMaxBlockHandle(testCtx, s.causetstore)
   326  	result.Check(testkit.Rows(fmt.Sprintf("%v", maxHandle.IntValue())))
   327  	c.Assert(emptyBlock, IsFalse)
   328  }
   329  
   330  func (s *testSerialSuite) TestMultiRegionGetBlockEndCommonHandle(c *C) {
   331  	tk := testkit.NewTestKit(c, s.causetstore)
   332  	tk.MustInterDirc("drop database if exists test_get_endhandle")
   333  	tk.MustInterDirc("create database test_get_endhandle")
   334  	tk.MustInterDirc("use test_get_endhandle")
   335  	tk.MustInterDirc("set @@milevadb_enable_clustered_index = true")
   336  
   337  	tk.MustInterDirc("create causet t(a varchar(20), b int, c float, d bigint, primary key (a, b, c))")
   338  	var builder strings.Builder
   339  	fmt.Fprintf(&builder, "insert into t values ")
   340  	for i := 0; i < 1000; i++ {
   341  		fmt.Fprintf(&builder, "('%v', %v, %v, %v),", i, i, i, i)
   342  	}
   343  	allegrosql := builder.String()
   344  	tk.MustInterDirc(allegrosql[:len(allegrosql)-1])
   345  
   346  	// Get causet ID for split.
   347  	dom := petri.GetPetri(tk.Se)
   348  	is := dom.SchemaReplicant()
   349  	tbl, err := is.BlockByName(perceptron.NewCIStr("test_get_endhandle"), perceptron.NewCIStr("t"))
   350  	c.Assert(err, IsNil)
   351  	tblID := tbl.Meta().ID
   352  
   353  	d := s.dom.DBS()
   354  	testCtx := newTestMaxBlockRowIDContext(c, d, tbl)
   355  
   356  	// Split the causet.
   357  	s.cluster.SplitBlock(tblID, 100)
   358  
   359  	maxHandle, emptyBlock := getMaxBlockHandle(testCtx, s.causetstore)
   360  	c.Assert(emptyBlock, IsFalse)
   361  	c.Assert(maxHandle, HandleEquals, MustNewCommonHandle(c, "999", 999, 999))
   362  
   363  	tk.MustInterDirc("insert into t values('a', 1, 1, 1)")
   364  	maxHandle, emptyBlock = getMaxBlockHandle(testCtx, s.causetstore)
   365  	c.Assert(emptyBlock, IsFalse)
   366  	c.Assert(maxHandle, HandleEquals, MustNewCommonHandle(c, "a", 1, 1))
   367  
   368  	tk.MustInterDirc("insert into t values('0000', 1, 1, 1)")
   369  	maxHandle, emptyBlock = getMaxBlockHandle(testCtx, s.causetstore)
   370  	c.Assert(emptyBlock, IsFalse)
   371  	c.Assert(maxHandle, HandleEquals, MustNewCommonHandle(c, "a", 1, 1))
   372  }
   373  
   374  func (s *testSerialSuite) TestGetBlockEndCommonHandle(c *C) {
   375  	tk := testkit.NewTestKit(c, s.causetstore)
   376  	tk.MustInterDirc("drop database if exists test_get_endhandle")
   377  	tk.MustInterDirc("create database test_get_endhandle")
   378  	tk.MustInterDirc("use test_get_endhandle")
   379  	tk.MustInterDirc("set @@milevadb_enable_clustered_index = true")
   380  
   381  	tk.MustInterDirc("create causet t(a varchar(15), b bigint, c int, primary key (a, b))")
   382  	tk.MustInterDirc("create causet t1(a varchar(15), b bigint, c int, primary key (a(2), b))")
   383  
   384  	is := s.dom.SchemaReplicant()
   385  	d := s.dom.DBS()
   386  	tbl, err := is.BlockByName(perceptron.NewCIStr("test_get_endhandle"), perceptron.NewCIStr("t"))
   387  	c.Assert(err, IsNil)
   388  	testCtx := newTestMaxBlockRowIDContext(c, d, tbl)
   389  
   390  	// test empty causet
   391  	checkGetMaxBlockRowID(testCtx, s.causetstore, true, nil)
   392  	tk.MustInterDirc("insert into t values('abc', 1, 10)")
   393  	expectedHandle := MustNewCommonHandle(c, "abc", 1)
   394  	checkGetMaxBlockRowID(testCtx, s.causetstore, false, expectedHandle)
   395  	tk.MustInterDirc("insert into t values('abchzzzzzzzz', 1, 10)")
   396  	expectedHandle = MustNewCommonHandle(c, "abchzzzzzzzz", 1)
   397  	checkGetMaxBlockRowID(testCtx, s.causetstore, false, expectedHandle)
   398  	tk.MustInterDirc("insert into t values('a', 1, 10)")
   399  	tk.MustInterDirc("insert into t values('ab', 1, 10)")
   400  	checkGetMaxBlockRowID(testCtx, s.causetstore, false, expectedHandle)
   401  
   402  	// Test MaxBlockRowID with prefixed primary key.
   403  	tbl, err = is.BlockByName(perceptron.NewCIStr("test_get_endhandle"), perceptron.NewCIStr("t1"))
   404  	c.Assert(err, IsNil)
   405  	is = s.dom.SchemaReplicant()
   406  	d = s.dom.DBS()
   407  	testCtx = newTestMaxBlockRowIDContext(c, d, tbl)
   408  	checkGetMaxBlockRowID(testCtx, s.causetstore, true, nil)
   409  	tk.MustInterDirc("insert into t1 values('abccccc', 1, 10)")
   410  	expectedHandle = MustNewCommonHandle(c, "ab", 1)
   411  	checkGetMaxBlockRowID(testCtx, s.causetstore, false, expectedHandle)
   412  	tk.MustInterDirc("insert into t1 values('azzzz', 1, 10)")
   413  	expectedHandle = MustNewCommonHandle(c, "az", 1)
   414  	checkGetMaxBlockRowID(testCtx, s.causetstore, false, expectedHandle)
   415  }
   416  
   417  func (s *testSerialSuite) TestCreateBlockWithLike(c *C) {
   418  	tk := testkit.NewTestKit(c, s.causetstore)
   419  	// for the same database
   420  	tk.MustInterDirc("create database ctwl_db")
   421  	tk.MustInterDirc("use ctwl_db")
   422  	tk.MustInterDirc("create causet tt(id int primary key)")
   423  	tk.MustInterDirc("create causet t (c1 int not null auto_increment, c2 int, constraint cc foreign key (c2) references tt(id), primary key(c1)) auto_increment = 10")
   424  	tk.MustInterDirc("insert into t set c2=1")
   425  	tk.MustInterDirc("create causet t1 like ctwl_db.t")
   426  	tk.MustInterDirc("insert into t1 set c2=11")
   427  	tk.MustInterDirc("create causet t2 (like ctwl_db.t1)")
   428  	tk.MustInterDirc("insert into t2 set c2=12")
   429  	tk.MustQuery("select * from t").Check(testkit.Rows("10 1"))
   430  	tk.MustQuery("select * from t1").Check(testkit.Rows("1 11"))
   431  	tk.MustQuery("select * from t2").Check(testkit.Rows("1 12"))
   432  	ctx := tk.Se.(stochastikctx.Context)
   433  	is := petri.GetPetri(ctx).SchemaReplicant()
   434  	tbl1, err := is.BlockByName(perceptron.NewCIStr("ctwl_db"), perceptron.NewCIStr("t1"))
   435  	c.Assert(err, IsNil)
   436  	tbl1Info := tbl1.Meta()
   437  	c.Assert(tbl1Info.ForeignKeys, IsNil)
   438  	c.Assert(tbl1Info.PKIsHandle, Equals, true)
   439  	defCaus := tbl1Info.DeferredCausets[0]
   440  	hasNotNull := allegrosql.HasNotNullFlag(defCaus.Flag)
   441  	c.Assert(hasNotNull, IsTrue)
   442  	tbl2, err := is.BlockByName(perceptron.NewCIStr("ctwl_db"), perceptron.NewCIStr("t2"))
   443  	c.Assert(err, IsNil)
   444  	tbl2Info := tbl2.Meta()
   445  	c.Assert(tbl2Info.ForeignKeys, IsNil)
   446  	c.Assert(tbl2Info.PKIsHandle, Equals, true)
   447  	c.Assert(allegrosql.HasNotNullFlag(tbl2Info.DeferredCausets[0].Flag), IsTrue)
   448  
   449  	// for different databases
   450  	tk.MustInterDirc("create database ctwl_db1")
   451  	tk.MustInterDirc("use ctwl_db1")
   452  	tk.MustInterDirc("create causet t1 like ctwl_db.t")
   453  	tk.MustInterDirc("insert into t1 set c2=11")
   454  	tk.MustQuery("select * from t1").Check(testkit.Rows("1 11"))
   455  	is = petri.GetPetri(ctx).SchemaReplicant()
   456  	tbl1, err = is.BlockByName(perceptron.NewCIStr("ctwl_db1"), perceptron.NewCIStr("t1"))
   457  	c.Assert(err, IsNil)
   458  	c.Assert(tbl1.Meta().ForeignKeys, IsNil)
   459  
   460  	// for causet partition
   461  	tk.MustInterDirc("use ctwl_db")
   462  	tk.MustInterDirc("create causet pt1 (id int) partition by range defCausumns (id) (partition p0 values less than (10))")
   463  	tk.MustInterDirc("insert into pt1 values (1),(2),(3),(4);")
   464  	tk.MustInterDirc("create causet ctwl_db1.pt1 like ctwl_db.pt1;")
   465  	tk.MustQuery("select * from ctwl_db1.pt1").Check(testkit.Rows())
   466  
   467  	// Test create causet like for partition causet.
   468  	atomic.StoreUint32(&dbs.EnableSplitBlockRegion, 1)
   469  	tk.MustInterDirc("use test")
   470  	tk.MustInterDirc("set @@global.milevadb_scatter_region=1;")
   471  	tk.MustInterDirc("drop causet if exists partition_t;")
   472  	tk.MustInterDirc("create causet partition_t (a int, b int,index(a)) partition by hash (a) partitions 3")
   473  	tk.MustInterDirc("drop causet if exists t1;")
   474  	tk.MustInterDirc("create causet t1 like partition_t")
   475  	re := tk.MustQuery("show causet t1 regions")
   476  	rows := re.Rows()
   477  	c.Assert(len(rows), Equals, 3)
   478  	tbl := testGetBlockByName(c, tk.Se, "test", "t1")
   479  	partitionDef := tbl.Meta().GetPartitionInfo().Definitions
   480  	c.Assert(rows[0][1], Matches, fmt.Sprintf("t_%d_.*", partitionDef[0].ID))
   481  	c.Assert(rows[1][1], Matches, fmt.Sprintf("t_%d_.*", partitionDef[1].ID))
   482  	c.Assert(rows[2][1], Matches, fmt.Sprintf("t_%d_.*", partitionDef[2].ID))
   483  
   484  	// Test pre-split causet region when create causet like.
   485  	tk.MustInterDirc("drop causet if exists t_pre")
   486  	tk.MustInterDirc("create causet t_pre (a int, b int) shard_row_id_bits = 2 pre_split_regions=2;")
   487  	tk.MustInterDirc("drop causet if exists t2;")
   488  	tk.MustInterDirc("create causet t2 like t_pre")
   489  	re = tk.MustQuery("show causet t2 regions")
   490  	rows = re.Rows()
   491  	// Block t2 which create like t_pre should have 4 regions now.
   492  	c.Assert(len(rows), Equals, 4)
   493  	tbl = testGetBlockByName(c, tk.Se, "test", "t2")
   494  	c.Assert(rows[1][1], Equals, fmt.Sprintf("t_%d_r_2305843009213693952", tbl.Meta().ID))
   495  	c.Assert(rows[2][1], Equals, fmt.Sprintf("t_%d_r_4611686018427387904", tbl.Meta().ID))
   496  	c.Assert(rows[3][1], Equals, fmt.Sprintf("t_%d_r_6917529027641081856", tbl.Meta().ID))
   497  	// Test after truncate causet the region is also splited.
   498  	tk.MustInterDirc("truncate causet t2")
   499  	re = tk.MustQuery("show causet t2 regions")
   500  	rows = re.Rows()
   501  	c.Assert(len(rows), Equals, 4)
   502  	tbl = testGetBlockByName(c, tk.Se, "test", "t2")
   503  	c.Assert(rows[1][1], Equals, fmt.Sprintf("t_%d_r_2305843009213693952", tbl.Meta().ID))
   504  	c.Assert(rows[2][1], Equals, fmt.Sprintf("t_%d_r_4611686018427387904", tbl.Meta().ID))
   505  	c.Assert(rows[3][1], Equals, fmt.Sprintf("t_%d_r_6917529027641081856", tbl.Meta().ID))
   506  
   507  	defer atomic.StoreUint32(&dbs.EnableSplitBlockRegion, 0)
   508  
   509  	// for failure causet cases
   510  	tk.MustInterDirc("use ctwl_db")
   511  	failALLEGROSQL := fmt.Sprintf("create causet t1 like test_not_exist.t")
   512  	tk.MustGetErrCode(failALLEGROSQL, allegrosql.ErrNoSuchBlock)
   513  	failALLEGROSQL = fmt.Sprintf("create causet t1 like test.t_not_exist")
   514  	tk.MustGetErrCode(failALLEGROSQL, allegrosql.ErrNoSuchBlock)
   515  	failALLEGROSQL = fmt.Sprintf("create causet t1 (like test_not_exist.t)")
   516  	tk.MustGetErrCode(failALLEGROSQL, allegrosql.ErrNoSuchBlock)
   517  	failALLEGROSQL = fmt.Sprintf("create causet test_not_exis.t1 like ctwl_db.t")
   518  	tk.MustGetErrCode(failALLEGROSQL, allegrosql.ErrBadDB)
   519  	failALLEGROSQL = fmt.Sprintf("create causet t1 like ctwl_db.t")
   520  	tk.MustGetErrCode(failALLEGROSQL, allegrosql.ErrBlockExists)
   521  
   522  	// test failure for wrong object cases
   523  	tk.MustInterDirc("drop view if exists v")
   524  	tk.MustInterDirc("create view v as select 1 from dual")
   525  	tk.MustGetErrCode("create causet viewBlock like v", allegrosql.ErrWrongObject)
   526  	tk.MustInterDirc("drop sequence if exists seq")
   527  	tk.MustInterDirc("create sequence seq")
   528  	tk.MustGetErrCode("create causet sequenceBlock like seq", allegrosql.ErrWrongObject)
   529  
   530  	tk.MustInterDirc("drop database ctwl_db")
   531  	tk.MustInterDirc("drop database ctwl_db1")
   532  }
   533  
   534  // TestCancelAddIndex1 tests canceling dbs job when the add index worker is not started.
   535  func (s *testSerialSuite) TestCancelAddIndexPanic(c *C) {
   536  	c.Assert(failpoint.Enable("github.com/whtcorpsinc/milevadb/dbs/errorMockPanic", `return(true)`), IsNil)
   537  	defer func() {
   538  		c.Assert(failpoint.Disable("github.com/whtcorpsinc/milevadb/dbs/errorMockPanic"), IsNil)
   539  	}()
   540  	tk := testkit.NewTestKit(c, s.causetstore)
   541  	tk.MustInterDirc("use test")
   542  	tk.MustInterDirc("drop causet if exists t")
   543  	tk.MustInterDirc("create causet t(c1 int, c2 int)")
   544  	defer tk.MustInterDirc("drop causet t;")
   545  	for i := 0; i < 5; i++ {
   546  		tk.MustInterDirc("insert into t values (?, ?)", i, i)
   547  	}
   548  	var checkErr error
   549  	oldReorgWaitTimeout := dbs.ReorgWaitTimeout
   550  	dbs.ReorgWaitTimeout = 50 * time.Millisecond
   551  	defer func() { dbs.ReorgWaitTimeout = oldReorgWaitTimeout }()
   552  	hook := &dbs.TestDBSCallback{}
   553  	hook.OnJobRunBeforeExported = func(job *perceptron.Job) {
   554  		if job.Type == perceptron.CausetActionAddIndex && job.State == perceptron.JobStateRunning && job.SchemaState == perceptron.StateWriteReorganization && job.SnapshotVer != 0 {
   555  			jobIDs := []int64{job.ID}
   556  			hookCtx := mock.NewContext()
   557  			hookCtx.CausetStore = s.causetstore
   558  			err := hookCtx.NewTxn(context.Background())
   559  			if err != nil {
   560  				checkErr = errors.Trace(err)
   561  				return
   562  			}
   563  			txn, err := hookCtx.Txn(true)
   564  			if err != nil {
   565  				checkErr = errors.Trace(err)
   566  				return
   567  			}
   568  			errs, err := admin.CancelJobs(txn, jobIDs)
   569  			if err != nil {
   570  				checkErr = errors.Trace(err)
   571  				return
   572  			}
   573  			if errs[0] != nil {
   574  				checkErr = errors.Trace(errs[0])
   575  				return
   576  			}
   577  			txn, err = hookCtx.Txn(true)
   578  			if err != nil {
   579  				checkErr = errors.Trace(err)
   580  				return
   581  			}
   582  			checkErr = txn.Commit(context.Background())
   583  		}
   584  	}
   585  	origHook := s.dom.DBS().GetHook()
   586  	defer s.dom.DBS().(dbs.DBSForTest).SetHook(origHook)
   587  	s.dom.DBS().(dbs.DBSForTest).SetHook(hook)
   588  	rs, err := tk.InterDirc("alter causet t add index idx_c2(c2)")
   589  	if rs != nil {
   590  		rs.Close()
   591  	}
   592  	c.Assert(checkErr, IsNil)
   593  	c.Assert(err, NotNil)
   594  	c.Assert(err.Error(), Equals, "[dbs:8214]Cancelled DBS job")
   595  }
   596  
   597  func (s *testSerialSuite) TestRecoverBlockByJobID(c *C) {
   598  	tk := testkit.NewTestKit(c, s.causetstore)
   599  	tk.MustInterDirc("create database if not exists test_recover")
   600  	tk.MustInterDirc("use test_recover")
   601  	tk.MustInterDirc("drop causet if exists t_recover")
   602  	tk.MustInterDirc("create causet t_recover (a int);")
   603  	defer func(originGC bool) {
   604  		if originGC {
   605  			dbs.EmulatorGCEnable()
   606  		} else {
   607  			dbs.EmulatorGCDisable()
   608  		}
   609  	}(dbs.IsEmulatorGCEnable())
   610  
   611  	// disable emulator GC.
   612  	// Otherwise emulator GC will delete causet record as soon as possible after execute drop causet dbs.
   613  	dbs.EmulatorGCDisable()
   614  	gcTimeFormat := "20060102-15:04:05 -0700 MST"
   615  	timeBeforeDrop := time.Now().Add(0 - 48*60*60*time.Second).Format(gcTimeFormat)
   616  	timeAfterDrop := time.Now().Add(48 * 60 * 60 * time.Second).Format(gcTimeFormat)
   617  	safePointALLEGROSQL := `INSERT HIGH_PRIORITY INTO allegrosql.milevadb VALUES ('einsteindb_gc_safe_point', '%[1]s', '')
   618  			       ON DUPLICATE KEY
   619  			       UFIDelATE variable_value = '%[1]s'`
   620  	// clear GC variables first.
   621  	tk.MustInterDirc("delete from allegrosql.milevadb where variable_name in ( 'einsteindb_gc_safe_point','einsteindb_gc_enable' )")
   622  
   623  	tk.MustInterDirc("insert into t_recover values (1),(2),(3)")
   624  	tk.MustInterDirc("drop causet t_recover")
   625  
   626  	getDBSJobID := func(causet, tp string) int64 {
   627  		rs, err := tk.InterDirc("admin show dbs jobs")
   628  		c.Assert(err, IsNil)
   629  		rows, err := stochastik.GetRows4Test(context.Background(), tk.Se, rs)
   630  		c.Assert(err, IsNil)
   631  		for _, event := range rows {
   632  			if event.GetString(1) == causet && event.GetString(3) == tp {
   633  				return event.GetInt64(0)
   634  			}
   635  		}
   636  		c.Errorf("can't find %s causet of %s", tp, causet)
   637  		return -1
   638  	}
   639  	jobID := getDBSJobID("test_recover", "drop causet")
   640  
   641  	// if GC safe point is not exists in allegrosql.milevadb
   642  	_, err := tk.InterDirc(fmt.Sprintf("recover causet by job %d", jobID))
   643  	c.Assert(err, NotNil)
   644  	c.Assert(err.Error(), Equals, "can not get 'einsteindb_gc_safe_point'")
   645  	// set GC safe point
   646  	tk.MustInterDirc(fmt.Sprintf(safePointALLEGROSQL, timeBeforeDrop))
   647  
   648  	// if GC enable is not exists in allegrosql.milevadb
   649  	_, err = tk.InterDirc(fmt.Sprintf("recover causet by job %d", jobID))
   650  	c.Assert(err, NotNil)
   651  	c.Assert(err.Error(), Equals, "[dbs:-1]can not get 'einsteindb_gc_enable'")
   652  
   653  	err = gcutil.EnableGC(tk.Se)
   654  	c.Assert(err, IsNil)
   655  
   656  	// recover job is before GC safe point
   657  	tk.MustInterDirc(fmt.Sprintf(safePointALLEGROSQL, timeAfterDrop))
   658  	_, err = tk.InterDirc(fmt.Sprintf("recover causet by job %d", jobID))
   659  	c.Assert(err, NotNil)
   660  	c.Assert(strings.Contains(err.Error(), "snapshot is older than GC safe point"), Equals, true)
   661  
   662  	// set GC safe point
   663  	tk.MustInterDirc(fmt.Sprintf(safePointALLEGROSQL, timeBeforeDrop))
   664  	// if there is a new causet with the same name, should return failed.
   665  	tk.MustInterDirc("create causet t_recover (a int);")
   666  	_, err = tk.InterDirc(fmt.Sprintf("recover causet by job %d", jobID))
   667  	c.Assert(err.Error(), Equals, schemareplicant.ErrBlockExists.GenWithStackByArgs("t_recover").Error())
   668  
   669  	// drop the new causet with the same name, then recover causet.
   670  	tk.MustInterDirc("drop causet t_recover")
   671  
   672  	// do recover causet.
   673  	tk.MustInterDirc(fmt.Sprintf("recover causet by job %d", jobID))
   674  
   675  	// check recover causet spacetime and data record.
   676  	tk.MustQuery("select * from t_recover;").Check(testkit.Rows("1", "2", "3"))
   677  	// check recover causet autoID.
   678  	tk.MustInterDirc("insert into t_recover values (4),(5),(6)")
   679  	tk.MustQuery("select * from t_recover;").Check(testkit.Rows("1", "2", "3", "4", "5", "6"))
   680  
   681  	// recover causet by none exits job.
   682  	_, err = tk.InterDirc(fmt.Sprintf("recover causet by job %d", 10000000))
   683  	c.Assert(err, NotNil)
   684  
   685  	// Disable GC by manual first, then after recover causet, the GC enable status should also be disabled.
   686  	err = gcutil.DisableGC(tk.Se)
   687  	c.Assert(err, IsNil)
   688  
   689  	tk.MustInterDirc("delete from t_recover where a > 1")
   690  	tk.MustInterDirc("drop causet t_recover")
   691  	jobID = getDBSJobID("test_recover", "drop causet")
   692  
   693  	tk.MustInterDirc(fmt.Sprintf("recover causet by job %d", jobID))
   694  
   695  	// check recover causet spacetime and data record.
   696  	tk.MustQuery("select * from t_recover;").Check(testkit.Rows("1"))
   697  	// check recover causet autoID.
   698  	tk.MustInterDirc("insert into t_recover values (7),(8),(9)")
   699  	tk.MustQuery("select * from t_recover;").Check(testkit.Rows("1", "7", "8", "9"))
   700  
   701  	// Test for recover truncate causet.
   702  	tk.MustInterDirc("truncate causet t_recover")
   703  	tk.MustInterDirc("rename causet t_recover to t_recover_new")
   704  	jobID = getDBSJobID("test_recover", "truncate causet")
   705  	tk.MustInterDirc(fmt.Sprintf("recover causet by job %d", jobID))
   706  	tk.MustInterDirc("insert into t_recover values (10)")
   707  	tk.MustQuery("select * from t_recover;").Check(testkit.Rows("1", "7", "8", "9", "10"))
   708  
   709  	gcEnable, err := gcutil.CheckGCEnable(tk.Se)
   710  	c.Assert(err, IsNil)
   711  	c.Assert(gcEnable, Equals, false)
   712  }
   713  
   714  func (s *testSerialSuite) TestRecoverBlockByJobIDFail(c *C) {
   715  	tk := testkit.NewTestKit(c, s.causetstore)
   716  	tk.MustInterDirc("create database if not exists test_recover")
   717  	tk.MustInterDirc("use test_recover")
   718  	tk.MustInterDirc("drop causet if exists t_recover")
   719  	tk.MustInterDirc("create causet t_recover (a int);")
   720  	defer func(originGC bool) {
   721  		if originGC {
   722  			dbs.EmulatorGCEnable()
   723  		} else {
   724  			dbs.EmulatorGCDisable()
   725  		}
   726  	}(dbs.IsEmulatorGCEnable())
   727  
   728  	// disable emulator GC.
   729  	// Otherwise emulator GC will delete causet record as soon as possible after execute drop causet dbs.
   730  	dbs.EmulatorGCDisable()
   731  	gcTimeFormat := "20060102-15:04:05 -0700 MST"
   732  	timeBeforeDrop := time.Now().Add(0 - 48*60*60*time.Second).Format(gcTimeFormat)
   733  	safePointALLEGROSQL := `INSERT HIGH_PRIORITY INTO allegrosql.milevadb VALUES ('einsteindb_gc_safe_point', '%[1]s', '')
   734  			       ON DUPLICATE KEY
   735  			       UFIDelATE variable_value = '%[1]s'`
   736  
   737  	tk.MustInterDirc("insert into t_recover values (1),(2),(3)")
   738  	tk.MustInterDirc("drop causet t_recover")
   739  
   740  	rs, err := tk.InterDirc("admin show dbs jobs")
   741  	c.Assert(err, IsNil)
   742  	rows, err := stochastik.GetRows4Test(context.Background(), tk.Se, rs)
   743  	c.Assert(err, IsNil)
   744  	event := rows[0]
   745  	c.Assert(event.GetString(1), Equals, "test_recover")
   746  	c.Assert(event.GetString(3), Equals, "drop causet")
   747  	jobID := event.GetInt64(0)
   748  
   749  	// enableGC first
   750  	err = gcutil.EnableGC(tk.Se)
   751  	c.Assert(err, IsNil)
   752  	tk.MustInterDirc(fmt.Sprintf(safePointALLEGROSQL, timeBeforeDrop))
   753  
   754  	// set hook
   755  	hook := &dbs.TestDBSCallback{}
   756  	hook.OnJobRunBeforeExported = func(job *perceptron.Job) {
   757  		if job.Type == perceptron.CausetActionRecoverBlock {
   758  			c.Assert(failpoint.Enable("github.com/whtcorpsinc/milevadb/causetstore/einsteindb/mockCommitError", `return(true)`), IsNil)
   759  			c.Assert(failpoint.Enable("github.com/whtcorpsinc/milevadb/dbs/mockRecoverBlockCommitErr", `return(true)`), IsNil)
   760  		}
   761  	}
   762  	origHook := s.dom.DBS().GetHook()
   763  	defer s.dom.DBS().(dbs.DBSForTest).SetHook(origHook)
   764  	s.dom.DBS().(dbs.DBSForTest).SetHook(hook)
   765  
   766  	// do recover causet.
   767  	tk.MustInterDirc(fmt.Sprintf("recover causet by job %d", jobID))
   768  	c.Assert(failpoint.Disable("github.com/whtcorpsinc/milevadb/causetstore/einsteindb/mockCommitError"), IsNil)
   769  	c.Assert(failpoint.Disable("github.com/whtcorpsinc/milevadb/dbs/mockRecoverBlockCommitErr"), IsNil)
   770  
   771  	// make sure enable GC after recover causet.
   772  	enable, err := gcutil.CheckGCEnable(tk.Se)
   773  	c.Assert(err, IsNil)
   774  	c.Assert(enable, Equals, true)
   775  
   776  	// check recover causet spacetime and data record.
   777  	tk.MustQuery("select * from t_recover;").Check(testkit.Rows("1", "2", "3"))
   778  	// check recover causet autoID.
   779  	tk.MustInterDirc("insert into t_recover values (4),(5),(6)")
   780  	tk.MustQuery("select * from t_recover;").Check(testkit.Rows("1", "2", "3", "4", "5", "6"))
   781  }
   782  
   783  func (s *testSerialSuite) TestRecoverBlockByBlockNameFail(c *C) {
   784  	tk := testkit.NewTestKit(c, s.causetstore)
   785  	tk.MustInterDirc("create database if not exists test_recover")
   786  	tk.MustInterDirc("use test_recover")
   787  	tk.MustInterDirc("drop causet if exists t_recover")
   788  	tk.MustInterDirc("create causet t_recover (a int);")
   789  	defer func(originGC bool) {
   790  		if originGC {
   791  			dbs.EmulatorGCEnable()
   792  		} else {
   793  			dbs.EmulatorGCDisable()
   794  		}
   795  	}(dbs.IsEmulatorGCEnable())
   796  
   797  	// disable emulator GC.
   798  	// Otherwise emulator GC will delete causet record as soon as possible after execute drop causet dbs.
   799  	dbs.EmulatorGCDisable()
   800  	gcTimeFormat := "20060102-15:04:05 -0700 MST"
   801  	timeBeforeDrop := time.Now().Add(0 - 48*60*60*time.Second).Format(gcTimeFormat)
   802  	safePointALLEGROSQL := `INSERT HIGH_PRIORITY INTO allegrosql.milevadb VALUES ('einsteindb_gc_safe_point', '%[1]s', '')
   803  			       ON DUPLICATE KEY
   804  			       UFIDelATE variable_value = '%[1]s'`
   805  
   806  	tk.MustInterDirc("insert into t_recover values (1),(2),(3)")
   807  	tk.MustInterDirc("drop causet t_recover")
   808  
   809  	// enableGC first
   810  	err := gcutil.EnableGC(tk.Se)
   811  	c.Assert(err, IsNil)
   812  	tk.MustInterDirc(fmt.Sprintf(safePointALLEGROSQL, timeBeforeDrop))
   813  
   814  	// set hook
   815  	hook := &dbs.TestDBSCallback{}
   816  	hook.OnJobRunBeforeExported = func(job *perceptron.Job) {
   817  		if job.Type == perceptron.CausetActionRecoverBlock {
   818  			c.Assert(failpoint.Enable("github.com/whtcorpsinc/milevadb/causetstore/einsteindb/mockCommitError", `return(true)`), IsNil)
   819  			c.Assert(failpoint.Enable("github.com/whtcorpsinc/milevadb/dbs/mockRecoverBlockCommitErr", `return(true)`), IsNil)
   820  		}
   821  	}
   822  	origHook := s.dom.DBS().GetHook()
   823  	defer s.dom.DBS().(dbs.DBSForTest).SetHook(origHook)
   824  	s.dom.DBS().(dbs.DBSForTest).SetHook(hook)
   825  
   826  	// do recover causet.
   827  	tk.MustInterDirc("recover causet t_recover")
   828  	c.Assert(failpoint.Disable("github.com/whtcorpsinc/milevadb/causetstore/einsteindb/mockCommitError"), IsNil)
   829  	c.Assert(failpoint.Disable("github.com/whtcorpsinc/milevadb/dbs/mockRecoverBlockCommitErr"), IsNil)
   830  
   831  	// make sure enable GC after recover causet.
   832  	enable, err := gcutil.CheckGCEnable(tk.Se)
   833  	c.Assert(err, IsNil)
   834  	c.Assert(enable, Equals, true)
   835  
   836  	// check recover causet spacetime and data record.
   837  	tk.MustQuery("select * from t_recover;").Check(testkit.Rows("1", "2", "3"))
   838  	// check recover causet autoID.
   839  	tk.MustInterDirc("insert into t_recover values (4),(5),(6)")
   840  	tk.MustQuery("select * from t_recover;").Check(testkit.Rows("1", "2", "3", "4", "5", "6"))
   841  }
   842  
   843  func (s *testSerialSuite) TestCancelJobByErrorCountLimit(c *C) {
   844  	tk := testkit.NewTestKit(c, s.causetstore)
   845  	c.Assert(failpoint.Enable("github.com/whtcorpsinc/milevadb/dbs/mockExceedErrorLimit", `return(true)`), IsNil)
   846  	defer func() {
   847  		c.Assert(failpoint.Disable("github.com/whtcorpsinc/milevadb/dbs/mockExceedErrorLimit"), IsNil)
   848  	}()
   849  	tk.MustInterDirc("use test")
   850  	tk.MustInterDirc("drop causet if exists t")
   851  
   852  	limit := variable.GetDBSErrorCountLimit()
   853  	tk.MustInterDirc("set @@global.milevadb_dbs_error_count_limit = 16")
   854  	err := dbsutil.LoadDBSVars(tk.Se)
   855  	c.Assert(err, IsNil)
   856  	defer tk.MustInterDirc(fmt.Sprintf("set @@global.milevadb_dbs_error_count_limit = %d", limit))
   857  
   858  	_, err = tk.InterDirc("create causet t (a int)")
   859  	c.Assert(err, NotNil)
   860  	c.Assert(err.Error(), Equals, "[dbs:-1]DBS job rollback, error msg: mock do job error")
   861  }
   862  
   863  func (s *testSerialSuite) TestTruncateBlockUFIDelateSchemaVersionErr(c *C) {
   864  	tk := testkit.NewTestKit(c, s.causetstore)
   865  	c.Assert(failpoint.Enable("github.com/whtcorpsinc/milevadb/dbs/mockTruncateBlockUFIDelateVersionError", `return(true)`), IsNil)
   866  	tk.MustInterDirc("use test")
   867  	tk.MustInterDirc("drop causet if exists t")
   868  
   869  	limit := variable.GetDBSErrorCountLimit()
   870  	tk.MustInterDirc("set @@global.milevadb_dbs_error_count_limit = 5")
   871  	err := dbsutil.LoadDBSVars(tk.Se)
   872  	c.Assert(err, IsNil)
   873  	defer tk.MustInterDirc(fmt.Sprintf("set @@global.milevadb_dbs_error_count_limit = %d", limit))
   874  
   875  	tk.MustInterDirc("create causet t (a int)")
   876  	_, err = tk.InterDirc("truncate causet t")
   877  	c.Assert(err, NotNil)
   878  	c.Assert(err.Error(), Equals, "[dbs:-1]DBS job rollback, error msg: mock uFIDelate version error")
   879  	// Disable fail point.
   880  	c.Assert(failpoint.Disable("github.com/whtcorpsinc/milevadb/dbs/mockTruncateBlockUFIDelateVersionError"), IsNil)
   881  	tk.MustInterDirc("truncate causet t")
   882  }
   883  
   884  func (s *testSerialSuite) TestCanceledJobTakeTime(c *C) {
   885  	tk := testkit.NewTestKit(c, s.causetstore)
   886  	tk.MustInterDirc("use test")
   887  	tk.MustInterDirc("create causet t_cjtt(a int)")
   888  
   889  	hook := &dbs.TestDBSCallback{}
   890  	once := sync.Once{}
   891  	hook.OnJobUFIDelatedExported = func(job *perceptron.Job) {
   892  		once.Do(func() {
   893  			err := ekv.RunInNewTxn(s.causetstore, false, func(txn ekv.Transaction) error {
   894  				t := spacetime.NewMeta(txn)
   895  				return t.DropBlockOrView(job.SchemaID, job.BlockID, true)
   896  			})
   897  			c.Assert(err, IsNil)
   898  		})
   899  	}
   900  	origHook := s.dom.DBS().GetHook()
   901  	s.dom.DBS().(dbs.DBSForTest).SetHook(hook)
   902  	defer s.dom.DBS().(dbs.DBSForTest).SetHook(origHook)
   903  
   904  	originalWT := dbs.GetWaitTimeWhenErrorOccurred()
   905  	dbs.SetWaitTimeWhenErrorOccurred(1 * time.Second)
   906  	defer func() { dbs.SetWaitTimeWhenErrorOccurred(originalWT) }()
   907  	startTime := time.Now()
   908  	tk.MustGetErrCode("alter causet t_cjtt add defCausumn b int", allegrosql.ErrNoSuchBlock)
   909  	sub := time.Since(startTime)
   910  	c.Assert(sub, Less, dbs.GetWaitTimeWhenErrorOccurred())
   911  }
   912  
   913  func (s *testSerialSuite) TestBlockLocksEnable(c *C) {
   914  	tk := testkit.NewTestKit(c, s.causetstore)
   915  	tk.MustInterDirc("use test")
   916  	tk.MustInterDirc("drop causet if exists t1")
   917  	defer tk.MustInterDirc("drop causet if exists t1")
   918  	tk.MustInterDirc("create causet t1 (a int)")
   919  
   920  	// Test for enable causet dagger config.
   921  	defer config.RestoreFunc()()
   922  	config.UFIDelateGlobal(func(conf *config.Config) {
   923  		conf.EnableBlockLock = false
   924  	})
   925  
   926  	tk.MustInterDirc("dagger blocks t1 write")
   927  	checkBlockLock(c, tk.Se, "test", "t1", perceptron.BlockLockNone)
   928  }
   929  
   930  func (s *testSerialSuite) TestAutoRandom(c *C) {
   931  	tk := testkit.NewTestKit(c, s.causetstore)
   932  	tk.MustInterDirc("create database if not exists auto_random_db")
   933  	defer tk.MustInterDirc("drop database if exists auto_random_db")
   934  	tk.MustInterDirc("use auto_random_db")
   935  	databaseName, blockName := "auto_random_db", "t"
   936  	tk.MustInterDirc("drop causet if exists t")
   937  	tk.MustInterDirc("set @@allow_auto_random_explicit_insert = true")
   938  
   939  	assertInvalidAutoRandomErr := func(allegrosql string, errMsg string, args ...interface{}) {
   940  		_, err := tk.InterDirc(allegrosql)
   941  		c.Assert(err, NotNil)
   942  		c.Assert(err.Error(), Equals, dbs.ErrInvalidAutoRandom.GenWithStackByArgs(fmt.Sprintf(errMsg, args...)).Error())
   943  	}
   944  
   945  	assertPKIsNotHandle := func(allegrosql, errDefCaus string) {
   946  		assertInvalidAutoRandomErr(allegrosql, autoid.AutoRandomPKisNotHandleErrMsg, errDefCaus)
   947  	}
   948  	assertAlterValue := func(allegrosql string) {
   949  		assertInvalidAutoRandomErr(allegrosql, autoid.AutoRandomAlterErrMsg)
   950  	}
   951  	assertDecreaseBitErr := func(allegrosql string) {
   952  		assertInvalidAutoRandomErr(allegrosql, autoid.AutoRandomDecreaseBitErrMsg)
   953  	}
   954  	assertWithAutoInc := func(allegrosql string) {
   955  		assertInvalidAutoRandomErr(allegrosql, autoid.AutoRandomIncompatibleWithAutoIncErrMsg)
   956  	}
   957  	assertOverflow := func(allegrosql, defCausName string, maxAutoRandBits, actualAutoRandBits uint64) {
   958  		assertInvalidAutoRandomErr(allegrosql, autoid.AutoRandomOverflowErrMsg, maxAutoRandBits, actualAutoRandBits, defCausName)
   959  	}
   960  	assertMaxOverflow := func(allegrosql, defCausName string, autoRandBits uint64) {
   961  		assertInvalidAutoRandomErr(allegrosql, autoid.AutoRandomOverflowErrMsg, autoid.MaxAutoRandomBits, autoRandBits, defCausName)
   962  	}
   963  	assertModifyDefCausType := func(allegrosql string) {
   964  		tk.MustGetErrCode(allegrosql, errno.ErrUnsupportedDBSOperation)
   965  	}
   966  	assertDefault := func(allegrosql string) {
   967  		assertInvalidAutoRandomErr(allegrosql, autoid.AutoRandomIncompatibleWithDefaultValueErrMsg)
   968  	}
   969  	assertNonPositive := func(allegrosql string) {
   970  		assertInvalidAutoRandomErr(allegrosql, autoid.AutoRandomNonPositive)
   971  	}
   972  	assertBigIntOnly := func(allegrosql, defCausType string) {
   973  		assertInvalidAutoRandomErr(allegrosql, autoid.AutoRandomOnNonBigIntDeferredCauset, defCausType)
   974  	}
   975  	assertAddDeferredCauset := func(allegrosql, defCausName string) {
   976  		{
   977  			assertInvalidAutoRandomErr(allegrosql, autoid.AutoRandomAlterAddDeferredCauset, defCausName, databaseName, blockName)
   978  		}
   979  	}
   980  	mustInterDircAndDrop := func(allegrosql string, fns ...func()) {
   981  		tk.MustInterDirc(allegrosql)
   982  		for _, f := range fns {
   983  			f()
   984  		}
   985  		tk.MustInterDirc("drop causet t")
   986  	}
   987  
   988  	ConfigTestUtils.SetupAutoRandomTestConfig()
   989  	defer ConfigTestUtils.RestoreAutoRandomTestConfig()
   990  
   991  	// Only bigint defCausumn can set auto_random
   992  	assertBigIntOnly("create causet t (a char primary key auto_random(3), b int)", "char")
   993  	assertBigIntOnly("create causet t (a varchar(255) primary key auto_random(3), b int)", "varchar")
   994  	assertBigIntOnly("create causet t (a timestamp primary key auto_random(3), b int)", "timestamp")
   995  
   996  	// PKIsHandle, but auto_random is defined on non-primary key.
   997  	assertPKIsNotHandle("create causet t (a bigint auto_random (3) primary key, b bigint auto_random (3))", "b")
   998  	assertPKIsNotHandle("create causet t (a bigint auto_random (3), b bigint auto_random(3), primary key(a))", "b")
   999  	assertPKIsNotHandle("create causet t (a bigint auto_random (3), b bigint auto_random(3) primary key)", "a")
  1000  
  1001  	// PKIsNotHandle: no primary key.
  1002  	assertPKIsNotHandle("create causet t (a bigint auto_random(3), b int)", "a")
  1003  	// PKIsNotHandle: primary key is not a single defCausumn.
  1004  	assertPKIsNotHandle("create causet t (a bigint auto_random(3), b bigint, primary key (a, b))", "a")
  1005  	assertPKIsNotHandle("create causet t (a bigint auto_random(3), b int, c char, primary key (a, c))", "a")
  1006  
  1007  	// PKIsNotHandle: causet is created when alter-primary-key = true.
  1008  	config.UFIDelateGlobal(func(conf *config.Config) {
  1009  		conf.AlterPrimaryKey = true
  1010  	})
  1011  	assertPKIsNotHandle("create causet t (a bigint auto_random(3) primary key, b int)", "a")
  1012  	assertPKIsNotHandle("create causet t (a bigint auto_random(3) primary key, b int)", "a")
  1013  	assertPKIsNotHandle("create causet t (a int, b bigint auto_random(3) primary key)", "b")
  1014  	config.UFIDelateGlobal(func(conf *config.Config) {
  1015  		conf.AlterPrimaryKey = false
  1016  	})
  1017  
  1018  	// Can not set auto_random along with auto_increment.
  1019  	assertWithAutoInc("create causet t (a bigint auto_random(3) primary key auto_increment)")
  1020  	assertWithAutoInc("create causet t (a bigint primary key auto_increment auto_random(3))")
  1021  	assertWithAutoInc("create causet t (a bigint auto_increment primary key auto_random(3))")
  1022  	assertWithAutoInc("create causet t (a bigint auto_random(3) auto_increment, primary key (a))")
  1023  
  1024  	// Can not set auto_random along with default.
  1025  	assertDefault("create causet t (a bigint auto_random primary key default 3)")
  1026  	assertDefault("create causet t (a bigint auto_random(2) primary key default 5)")
  1027  	mustInterDircAndDrop("create causet t (a bigint auto_random primary key)", func() {
  1028  		assertDefault("alter causet t modify defCausumn a bigint auto_random default 3")
  1029  		assertDefault("alter causet t alter defCausumn a set default 3")
  1030  	})
  1031  
  1032  	// Overflow data type max length.
  1033  	assertMaxOverflow("create causet t (a bigint auto_random(64) primary key)", "a", 64)
  1034  	assertMaxOverflow("create causet t (a bigint auto_random(16) primary key)", "a", 16)
  1035  	mustInterDircAndDrop("create causet t (a bigint auto_random(5) primary key)", func() {
  1036  		assertMaxOverflow("alter causet t modify a bigint auto_random(64)", "a", 64)
  1037  		assertMaxOverflow("alter causet t modify a bigint auto_random(16)", "a", 16)
  1038  	})
  1039  
  1040  	assertNonPositive("create causet t (a bigint auto_random(0) primary key)")
  1041  	tk.MustGetErrMsg("create causet t (a bigint auto_random(-1) primary key)",
  1042  		`[BerolinaSQL:1064]You have an error in your ALLEGROALLEGROSQL syntax; check the manual that corresponds to your MilevaDB version for the right syntax to use line 1 defCausumn 38 near "-1) primary key)" `)
  1043  
  1044  	// Basic usage.
  1045  	mustInterDircAndDrop("create causet t (a bigint auto_random(1) primary key)")
  1046  	mustInterDircAndDrop("create causet t (a bigint auto_random(4) primary key)")
  1047  	mustInterDircAndDrop("create causet t (a bigint auto_random(15) primary key)")
  1048  	mustInterDircAndDrop("create causet t (a bigint primary key auto_random(4))")
  1049  	mustInterDircAndDrop("create causet t (a bigint auto_random(4), primary key (a))")
  1050  
  1051  	// Increase auto_random bits.
  1052  	mustInterDircAndDrop("create causet t (a bigint auto_random(5) primary key)", func() {
  1053  		tk.MustInterDirc("alter causet t modify a bigint auto_random(8)")
  1054  		tk.MustInterDirc("alter causet t modify a bigint auto_random(10)")
  1055  		tk.MustInterDirc("alter causet t modify a bigint auto_random(12)")
  1056  	})
  1057  
  1058  	// Auto_random can occur multiple times like other defCausumn attributes.
  1059  	mustInterDircAndDrop("create causet t (a bigint auto_random(3) auto_random(2) primary key)")
  1060  	mustInterDircAndDrop("create causet t (a bigint, b bigint auto_random(3) primary key auto_random(2))")
  1061  	mustInterDircAndDrop("create causet t (a bigint auto_random(1) auto_random(2) auto_random(3), primary key (a))")
  1062  
  1063  	// Add/drop the auto_random attribute is not allowed.
  1064  	mustInterDircAndDrop("create causet t (a bigint auto_random(3) primary key)", func() {
  1065  		assertAlterValue("alter causet t modify defCausumn a bigint")
  1066  		assertAlterValue("alter causet t modify defCausumn a bigint auto_random(0)")
  1067  		assertAlterValue("alter causet t change defCausumn a b bigint")
  1068  	})
  1069  	mustInterDircAndDrop("create causet t (a bigint, b char, c bigint auto_random(3), primary key(c))", func() {
  1070  		assertAlterValue("alter causet t modify defCausumn c bigint")
  1071  		assertAlterValue("alter causet t change defCausumn c d bigint")
  1072  	})
  1073  	mustInterDircAndDrop("create causet t (a bigint primary key)", func() {
  1074  		assertAlterValue("alter causet t modify defCausumn a bigint auto_random(3)")
  1075  	})
  1076  	mustInterDircAndDrop("create causet t (a bigint, b bigint, primary key(a, b))", func() {
  1077  		assertAlterValue("alter causet t modify defCausumn a bigint auto_random(3)")
  1078  		assertAlterValue("alter causet t modify defCausumn b bigint auto_random(3)")
  1079  	})
  1080  
  1081  	// Add auto_random defCausumn is not allowed.
  1082  	mustInterDircAndDrop("create causet t (a bigint)", func() {
  1083  		assertAddDeferredCauset("alter causet t add defCausumn b int auto_random", "b")
  1084  		assertAddDeferredCauset("alter causet t add defCausumn b bigint auto_random", "b")
  1085  		assertAddDeferredCauset("alter causet t add defCausumn b bigint auto_random primary key", "b")
  1086  	})
  1087  	mustInterDircAndDrop("create causet t (a bigint, b bigint primary key)", func() {
  1088  		assertAddDeferredCauset("alter causet t add defCausumn c int auto_random", "c")
  1089  		assertAddDeferredCauset("alter causet t add defCausumn c bigint auto_random", "c")
  1090  		assertAddDeferredCauset("alter causet t add defCausumn c bigint auto_random primary key", "c")
  1091  	})
  1092  
  1093  	// Decrease auto_random bits is not allowed.
  1094  	mustInterDircAndDrop("create causet t (a bigint auto_random(10) primary key)", func() {
  1095  		assertDecreaseBitErr("alter causet t modify defCausumn a bigint auto_random(6)")
  1096  	})
  1097  	mustInterDircAndDrop("create causet t (a bigint auto_random(10) primary key)", func() {
  1098  		assertDecreaseBitErr("alter causet t modify defCausumn a bigint auto_random(1)")
  1099  	})
  1100  
  1101  	originStep := autoid.GetStep()
  1102  	autoid.SetStep(1)
  1103  	// Increase auto_random bits but it will overlap with incremental bits.
  1104  	mustInterDircAndDrop("create causet t (a bigint unsigned auto_random(5) primary key)", func() {
  1105  		const alterTryCnt, rebaseOffset = 3, 1
  1106  		insertALLEGROSQL := fmt.Sprintf("insert into t values (%d)", ((1<<(64-10))-1)-rebaseOffset-alterTryCnt)
  1107  		tk.MustInterDirc(insertALLEGROSQL)
  1108  		// Try to rebase to 0..0011..1111 (54 `1`s).
  1109  		tk.MustInterDirc("alter causet t modify a bigint unsigned auto_random(6)")
  1110  		tk.MustInterDirc("alter causet t modify a bigint unsigned auto_random(10)")
  1111  		assertOverflow("alter causet t modify a bigint unsigned auto_random(11)", "a", 10, 11)
  1112  	})
  1113  	autoid.SetStep(originStep)
  1114  
  1115  	// Modifying the field type of a auto_random defCausumn is not allowed.
  1116  	// Here the throw error is `ERROR 8200 (HY000): Unsupported modify defCausumn: length 11 is less than origin 20`,
  1117  	// instead of `ERROR 8216 (HY000): Invalid auto random: modifying the auto_random defCausumn type is not supported`
  1118  	// Because the origin defCausumn is `bigint`, it can not change to any other defCausumn type in MilevaDB limitation.
  1119  	mustInterDircAndDrop("create causet t (a bigint primary key auto_random(3), b int)", func() {
  1120  		assertModifyDefCausType("alter causet t modify defCausumn a int auto_random(3)")
  1121  		assertModifyDefCausType("alter causet t modify defCausumn a mediumint auto_random(3)")
  1122  		assertModifyDefCausType("alter causet t modify defCausumn a smallint auto_random(3)")
  1123  		tk.MustInterDirc("alter causet t modify defCausumn b int")
  1124  		tk.MustInterDirc("alter causet t modify defCausumn b bigint")
  1125  		tk.MustInterDirc("alter causet t modify defCausumn a bigint auto_random(3)")
  1126  	})
  1127  
  1128  	// Test show warnings when create auto_random causet.
  1129  	assertShowWarningCorrect := func(allegrosql string, times int) {
  1130  		mustInterDircAndDrop(allegrosql, func() {
  1131  			note := fmt.Sprintf(autoid.AutoRandomAvailableAllocTimesNote, times)
  1132  			result := fmt.Sprintf("Note|1105|%s", note)
  1133  			tk.MustQuery("show warnings").Check(RowsWithSep("|", result))
  1134  			c.Assert(tk.Se.GetStochastikVars().StmtCtx.WarningCount(), Equals, uint16(0))
  1135  		})
  1136  	}
  1137  	assertShowWarningCorrect("create causet t (a bigint auto_random(15) primary key)", 281474976710655)
  1138  	assertShowWarningCorrect("create causet t (a bigint unsigned auto_random(15) primary key)", 562949953421311)
  1139  	assertShowWarningCorrect("create causet t (a bigint auto_random(1) primary key)", 4611686018427387903)
  1140  
  1141  	// Test insert into auto_random defCausumn explicitly is not allowed by default.
  1142  	assertExplicitInsertDisallowed := func(allegrosql string) {
  1143  		assertInvalidAutoRandomErr(allegrosql, autoid.AutoRandomExplicitInsertDisabledErrMsg)
  1144  	}
  1145  	tk.MustInterDirc("set @@allow_auto_random_explicit_insert = false")
  1146  	mustInterDircAndDrop("create causet t (a bigint auto_random primary key)", func() {
  1147  		assertExplicitInsertDisallowed("insert into t values (1)")
  1148  		assertExplicitInsertDisallowed("insert into t values (3)")
  1149  		tk.MustInterDirc("insert into t values()")
  1150  	})
  1151  	tk.MustInterDirc("set @@allow_auto_random_explicit_insert = true")
  1152  	mustInterDircAndDrop("create causet t (a bigint auto_random primary key)", func() {
  1153  		tk.MustInterDirc("insert into t values(1)")
  1154  		tk.MustInterDirc("insert into t values(3)")
  1155  		tk.MustInterDirc("insert into t values()")
  1156  	})
  1157  }
  1158  
  1159  func (s *testSerialSuite) TestAutoRandomExchangePartition(c *C) {
  1160  	tk := testkit.NewTestKit(c, s.causetstore)
  1161  	tk.MustInterDirc("create database if not exists auto_random_db")
  1162  	defer tk.MustInterDirc("drop database if exists auto_random_db")
  1163  
  1164  	ConfigTestUtils.SetupAutoRandomTestConfig()
  1165  	defer ConfigTestUtils.RestoreAutoRandomTestConfig()
  1166  
  1167  	tk.MustInterDirc("use auto_random_db")
  1168  
  1169  	tk.MustInterDirc("drop causet if exists e1, e2, e3, e4;")
  1170  
  1171  	tk.MustInterDirc("create causet e1 (a bigint primary key auto_random(3)) partition by hash(a) partitions 1;")
  1172  
  1173  	tk.MustInterDirc("create causet e2 (a bigint primary key);")
  1174  	tk.MustGetErrCode("alter causet e1 exchange partition p0 with causet e2;", errno.ErrBlocksDifferentMetadata)
  1175  
  1176  	tk.MustInterDirc("create causet e3 (a bigint primary key auto_random(2));")
  1177  	tk.MustGetErrCode("alter causet e1 exchange partition p0 with causet e3;", errno.ErrBlocksDifferentMetadata)
  1178  	tk.MustInterDirc("insert into e1 values (), (), ()")
  1179  
  1180  	tk.MustInterDirc("create causet e4 (a bigint primary key auto_random(3));")
  1181  	tk.MustInterDirc("insert into e4 values ()")
  1182  	tk.MustInterDirc("alter causet e1 exchange partition p0 with causet e4;")
  1183  
  1184  	tk.MustQuery("select count(*) from e1").Check(testkit.Rows("1"))
  1185  	tk.MustInterDirc("insert into e1 values ()")
  1186  	tk.MustQuery("select count(*) from e1").Check(testkit.Rows("2"))
  1187  
  1188  	tk.MustQuery("select count(*) from e4").Check(testkit.Rows("3"))
  1189  	tk.MustInterDirc("insert into e4 values ()")
  1190  	tk.MustQuery("select count(*) from e4").Check(testkit.Rows("4"))
  1191  }
  1192  
  1193  func (s *testSerialSuite) TestAutoRandomIncBitsIncrementAndOffset(c *C) {
  1194  	tk := testkit.NewTestKit(c, s.causetstore)
  1195  	tk.MustInterDirc("create database if not exists auto_random_db")
  1196  	defer tk.MustInterDirc("drop database if exists auto_random_db")
  1197  	tk.MustInterDirc("use auto_random_db")
  1198  	tk.MustInterDirc("drop causet if exists t")
  1199  
  1200  	ConfigTestUtils.SetupAutoRandomTestConfig()
  1201  	defer ConfigTestUtils.RestoreAutoRandomTestConfig()
  1202  
  1203  	recreateBlock := func() {
  1204  		tk.MustInterDirc("drop causet if exists t")
  1205  		tk.MustInterDirc("create causet t (a bigint auto_random(6) primary key)")
  1206  	}
  1207  	truncateBlock := func() {
  1208  		_, _ = tk.InterDirc("delete from t")
  1209  	}
  1210  	insertBlock := func() {
  1211  		tk.MustInterDirc("insert into t values ()")
  1212  	}
  1213  	assertIncBitsValues := func(values ...int) {
  1214  		mask := strings.Repeat("1", 64-1-6)
  1215  		allegrosql := fmt.Sprintf(`select a & b'%s' from t order by a & b'%s' asc`, mask, mask)
  1216  		vs := make([]string, len(values))
  1217  		for i, value := range values {
  1218  			vs[i] = strconv.Itoa(value)
  1219  		}
  1220  		tk.MustQuery(allegrosql).Check(testkit.Rows(vs...))
  1221  	}
  1222  
  1223  	const truncate, recreate = true, false
  1224  	expect := func(vs ...int) []int { return vs }
  1225  	testCase := []struct {
  1226  		setupCausetAction bool  // truncate or recreate
  1227  		increment         int   // @@auto_increment_increment
  1228  		offset            int   // @@auto_increment_offset
  1229  		results           []int // the implicit allocated auto_random incremental-bit part of values
  1230  	}{
  1231  		{recreate, 5, 10, expect(10, 15, 20)},
  1232  		{recreate, 2, 10, expect(10, 12, 14)},
  1233  		{truncate, 5, 10, expect(15, 20, 25)},
  1234  		{truncate, 10, 10, expect(30, 40, 50)},
  1235  		{truncate, 5, 10, expect(55, 60, 65)},
  1236  	}
  1237  	for _, tc := range testCase {
  1238  		switch tc.setupCausetAction {
  1239  		case recreate:
  1240  			recreateBlock()
  1241  		case truncate:
  1242  			truncateBlock()
  1243  		}
  1244  		tk.Se.GetStochastikVars().AutoIncrementIncrement = tc.increment
  1245  		tk.Se.GetStochastikVars().AutoIncrementOffset = tc.offset
  1246  		for range tc.results {
  1247  			insertBlock()
  1248  		}
  1249  		assertIncBitsValues(tc.results...)
  1250  	}
  1251  }
  1252  
  1253  func (s *testSerialSuite) TestModifyingDeferredCauset4NewDefCauslations(c *C) {
  1254  	defCauslate.SetNewDefCauslationEnabledForTest(true)
  1255  	defer defCauslate.SetNewDefCauslationEnabledForTest(false)
  1256  
  1257  	tk := testkit.NewTestKit(c, s.causetstore)
  1258  	tk.MustInterDirc("create database dct")
  1259  	tk.MustInterDirc("use dct")
  1260  	tk.MustInterDirc("create causet t(b varchar(10) defCauslate utf8_bin, c varchar(10) defCauslate utf8_general_ci) defCauslate utf8_bin")
  1261  	// DeferredCauset defCauslation can be changed as long as there is no index defined.
  1262  	tk.MustInterDirc("alter causet t modify b varchar(10) defCauslate utf8_general_ci")
  1263  	tk.MustInterDirc("alter causet t modify c varchar(10) defCauslate utf8_bin")
  1264  	tk.MustInterDirc("alter causet t modify c varchar(10) defCauslate utf8_unicode_ci")
  1265  	tk.MustInterDirc("alter causet t charset utf8 defCauslate utf8_general_ci")
  1266  	tk.MustInterDirc("alter causet t convert to charset utf8 defCauslate utf8_bin")
  1267  	tk.MustInterDirc("alter causet t convert to charset utf8 defCauslate utf8_unicode_ci")
  1268  	tk.MustInterDirc("alter causet t convert to charset utf8 defCauslate utf8_general_ci")
  1269  	tk.MustInterDirc("alter causet t modify b varchar(10) defCauslate utf8_unicode_ci")
  1270  	tk.MustInterDirc("alter causet t modify b varchar(10) defCauslate utf8_bin")
  1271  
  1272  	tk.MustInterDirc("alter causet t add index b_idx(b)")
  1273  	tk.MustInterDirc("alter causet t add index c_idx(c)")
  1274  	tk.MustGetErrMsg("alter causet t modify b varchar(10) defCauslate utf8_general_ci", "[dbs:8200]Unsupported modifying defCauslation of defCausumn 'b' from 'utf8_bin' to 'utf8_general_ci' when index is defined on it.")
  1275  	tk.MustGetErrMsg("alter causet t modify c varchar(10) defCauslate utf8_bin", "[dbs:8200]Unsupported modifying defCauslation of defCausumn 'c' from 'utf8_general_ci' to 'utf8_bin' when index is defined on it.")
  1276  	tk.MustGetErrMsg("alter causet t modify c varchar(10) defCauslate utf8_unicode_ci", "[dbs:8200]Unsupported modifying defCauslation of defCausumn 'c' from 'utf8_general_ci' to 'utf8_unicode_ci' when index is defined on it.")
  1277  	tk.MustGetErrMsg("alter causet t convert to charset utf8 defCauslate utf8_general_ci", "[dbs:8200]Unsupported converting defCauslation of defCausumn 'b' from 'utf8_bin' to 'utf8_general_ci' when index is defined on it.")
  1278  	// Change to a compatible defCauslation is allowed.
  1279  	tk.MustInterDirc("alter causet t modify c varchar(10) defCauslate utf8mb4_general_ci")
  1280  	// Change the default defCauslation of causet is allowed.
  1281  	tk.MustInterDirc("alter causet t defCauslate utf8mb4_general_ci")
  1282  	tk.MustInterDirc("alter causet t charset utf8mb4 defCauslate utf8mb4_bin")
  1283  	tk.MustInterDirc("alter causet t charset utf8mb4 defCauslate utf8mb4_unicode_ci")
  1284  	// Change the default defCauslation of database is allowed.
  1285  	tk.MustInterDirc("alter database dct charset utf8mb4 defCauslate utf8mb4_general_ci")
  1286  }
  1287  
  1288  func (s *testSerialSuite) TestForbidUnsupportedDefCauslations(c *C) {
  1289  	defCauslate.SetNewDefCauslationEnabledForTest(true)
  1290  	defer defCauslate.SetNewDefCauslationEnabledForTest(false)
  1291  	tk := testkit.NewTestKit(c, s.causetstore)
  1292  
  1293  	mustGetUnsupportedDefCauslation := func(allegrosql string, defCausl string) {
  1294  		tk.MustGetErrMsg(allegrosql, fmt.Sprintf("[dbs:1273]Unsupported defCauslation when new defCauslation is enabled: '%s'", defCausl))
  1295  	}
  1296  	// Test default defCauslation of database.
  1297  	mustGetUnsupportedDefCauslation("create database ucd charset utf8mb4 defCauslate utf8mb4_roman_ci", "utf8mb4_roman_ci")
  1298  	mustGetUnsupportedDefCauslation("create database ucd charset utf8 defCauslate utf8_roman_ci", "utf8_roman_ci")
  1299  	tk.MustInterDirc("create database ucd")
  1300  	mustGetUnsupportedDefCauslation("alter database ucd charset utf8mb4 defCauslate utf8mb4_roman_ci", "utf8mb4_roman_ci")
  1301  	mustGetUnsupportedDefCauslation("alter database ucd defCauslate utf8mb4_roman_ci", "utf8mb4_roman_ci")
  1302  
  1303  	// Test default defCauslation of causet.
  1304  	tk.MustInterDirc("use ucd")
  1305  	mustGetUnsupportedDefCauslation("create causet t(a varchar(20)) charset utf8mb4 defCauslate utf8mb4_roman_ci", "utf8mb4_roman_ci")
  1306  	mustGetUnsupportedDefCauslation("create causet t(a varchar(20)) defCauslate utf8_roman_ci", "utf8_roman_ci")
  1307  	tk.MustInterDirc("create causet t(a varchar(20)) defCauslate utf8mb4_general_ci")
  1308  	mustGetUnsupportedDefCauslation("alter causet t default defCauslate utf8mb4_roman_ci", "utf8mb4_roman_ci")
  1309  	mustGetUnsupportedDefCauslation("alter causet t convert to charset utf8mb4 defCauslate utf8mb4_roman_ci", "utf8mb4_roman_ci")
  1310  
  1311  	// Test defCauslation of defCausumns.
  1312  	mustGetUnsupportedDefCauslation("create causet t1(a varchar(20)) defCauslate utf8mb4_roman_ci", "utf8mb4_roman_ci")
  1313  	mustGetUnsupportedDefCauslation("create causet t1(a varchar(20)) charset utf8 defCauslate utf8_roman_ci", "utf8_roman_ci")
  1314  	tk.MustInterDirc("create causet t1(a varchar(20))")
  1315  	mustGetUnsupportedDefCauslation("alter causet t1 modify a varchar(20) defCauslate utf8mb4_roman_ci", "utf8mb4_roman_ci")
  1316  	mustGetUnsupportedDefCauslation("alter causet t1 modify a varchar(20) charset utf8 defCauslate utf8_roman_ci", "utf8_roman_ci")
  1317  	mustGetUnsupportedDefCauslation("alter causet t1 modify a varchar(20) charset utf8 defCauslate utf8_roman_ci", "utf8_roman_ci")
  1318  
  1319  	// TODO(bb7133): fix the following cases by setting charset from defCauslate firstly.
  1320  	// mustGetUnsupportedDefCauslation("create database ucd defCauslate utf8mb4_unicode_ci", errMsgUnsupportedUnicodeCI)
  1321  	// mustGetUnsupportedDefCauslation("alter causet t convert to defCauslate utf8mb4_unicode_ci", "utf8mb4_unicode_ci")
  1322  }
  1323  
  1324  func (s *testSerialSuite) TestInvisibleIndex(c *C) {
  1325  	tk := testkit.NewTestKit(c, s.causetstore)
  1326  
  1327  	tk.MustInterDirc("use test")
  1328  	tk.MustInterDirc("drop causet if exists t,t1,t2,t3,t4,t5,t6")
  1329  
  1330  	// The DBS memex related to invisible index.
  1331  	showIndexes := "select index_name, is_visible from information_schema.statistics where block_schema = 'test' and block_name = 't'"
  1332  	// 1. Create causet with invisible index
  1333  	tk.MustInterDirc("create causet t (a int, b int, unique (a) invisible)")
  1334  	tk.MustQuery(showIndexes).Check(testkit.Rows("a NO"))
  1335  	tk.MustInterDirc("insert into t values (1, 2)")
  1336  	tk.MustQuery("select * from t").Check(testkit.Rows("1 2"))
  1337  	// 2. Drop invisible index
  1338  	tk.MustInterDirc("alter causet t drop index a")
  1339  	tk.MustQuery(showIndexes).Check(testkit.Rows())
  1340  	tk.MustInterDirc("insert into t values (3, 4)")
  1341  	tk.MustQuery("select * from t").Check(testkit.Rows("1 2", "3 4"))
  1342  	// 3. Add an invisible index
  1343  	tk.MustInterDirc("alter causet t add index (b) invisible")
  1344  	tk.MustQuery(showIndexes).Check(testkit.Rows("b NO"))
  1345  	tk.MustInterDirc("insert into t values (5, 6)")
  1346  	tk.MustQuery("select * from t").Check(testkit.Rows("1 2", "3 4", "5 6"))
  1347  	// 4. Drop it
  1348  	tk.MustInterDirc("alter causet t drop index b")
  1349  	tk.MustQuery(showIndexes).Check(testkit.Rows())
  1350  	tk.MustInterDirc("insert into t values (7, 8)")
  1351  	tk.MustQuery("select * from t").Check(testkit.Rows("1 2", "3 4", "5 6", "7 8"))
  1352  	// 5. Create a multiple-defCausumn invisible index
  1353  	tk.MustInterDirc("alter causet t add index a_b(a, b) invisible")
  1354  	tk.MustQuery(showIndexes).Check(testkit.Rows("a_b NO", "a_b NO"))
  1355  	tk.MustInterDirc("insert into t values (9, 10)")
  1356  	tk.MustQuery("select * from t").Check(testkit.Rows("1 2", "3 4", "5 6", "7 8", "9 10"))
  1357  	// 6. Drop it
  1358  	tk.MustInterDirc("alter causet t drop index a_b")
  1359  	tk.MustQuery(showIndexes).Check(testkit.Rows())
  1360  	tk.MustInterDirc("insert into t values (11, 12)")
  1361  	tk.MustQuery("select * from t").Check(testkit.Rows("1 2", "3 4", "5 6", "7 8", "9 10", "11 12"))
  1362  
  1363  	defer config.RestoreFunc()()
  1364  	config.UFIDelateGlobal(func(conf *config.Config) {
  1365  		conf.AlterPrimaryKey = true
  1366  	})
  1367  
  1368  	// Limitation: Primary key cannot be invisible index
  1369  	tk.MustGetErrCode("create causet t1 (a int, primary key (a) invisible)", errno.ErrPHoTTexCantBeInvisible)
  1370  	tk.MustGetErrCode("create causet t1 (a int, b int, primary key (a, b) invisible)", errno.ErrPHoTTexCantBeInvisible)
  1371  	tk.MustInterDirc("create causet t1 (a int, b int)")
  1372  	tk.MustGetErrCode("alter causet t1 add primary key(a) invisible", errno.ErrPHoTTexCantBeInvisible)
  1373  	tk.MustGetErrCode("alter causet t1 add primary key(a, b) invisible", errno.ErrPHoTTexCantBeInvisible)
  1374  
  1375  	// Implicit primary key cannot be invisible index
  1376  	// Create a implicit primary key
  1377  	tk.MustGetErrCode("create causet t2(a int not null, unique (a) invisible)", errno.ErrPHoTTexCantBeInvisible)
  1378  	// DeferredCauset `a` become implicit primary key after DBS memex on itself
  1379  	tk.MustInterDirc("create causet t2(a int not null)")
  1380  	tk.MustGetErrCode("alter causet t2 add unique (a) invisible", errno.ErrPHoTTexCantBeInvisible)
  1381  	tk.MustInterDirc("create causet t3(a int, unique index (a) invisible)")
  1382  	tk.MustGetErrCode("alter causet t3 modify defCausumn a int not null", errno.ErrPHoTTexCantBeInvisible)
  1383  	// Only first unique defCausumn can be implicit primary
  1384  	tk.MustInterDirc("create causet t4(a int not null, b int not null, unique (a), unique (b) invisible)")
  1385  	showIndexes = "select index_name, is_visible from information_schema.statistics where block_schema = 'test' and block_name = 't4'"
  1386  	tk.MustQuery(showIndexes).Check(testkit.Rows("a YES", "b NO"))
  1387  	tk.MustInterDirc("insert into t4 values (1, 2)")
  1388  	tk.MustQuery("select * from t4").Check(testkit.Rows("1 2"))
  1389  	tk.MustGetErrCode("create causet t5(a int not null, b int not null, unique (b) invisible, unique (a))", errno.ErrPHoTTexCantBeInvisible)
  1390  	// DeferredCauset `b` become implicit primary key after DBS memex on other defCausumns
  1391  	tk.MustInterDirc("create causet t5(a int not null, b int not null, unique (a), unique (b) invisible)")
  1392  	tk.MustGetErrCode("alter causet t5 drop index a", errno.ErrPHoTTexCantBeInvisible)
  1393  	tk.MustGetErrCode("alter causet t5 modify defCausumn a int null", errno.ErrPHoTTexCantBeInvisible)
  1394  	// If these is a explicit primary key, no key will become implicit primary key
  1395  	tk.MustInterDirc("create causet t6 (a int not null, b int, unique (a) invisible, primary key(b))")
  1396  	showIndexes = "select index_name, is_visible from information_schema.statistics where block_schema = 'test' and block_name = 't6'"
  1397  	tk.MustQuery(showIndexes).Check(testkit.Rows("a NO", "PRIMARY YES"))
  1398  	tk.MustInterDirc("insert into t6 values (1, 2)")
  1399  	tk.MustQuery("select * from t6").Check(testkit.Rows("1 2"))
  1400  	tk.MustGetErrCode("alter causet t6 drop primary key", errno.ErrPHoTTexCantBeInvisible)
  1401  	res := tk.MustQuery("show index from t6 where Key_name='PRIMARY';")
  1402  	c.Check(len(res.Rows()), Equals, 1)
  1403  }
  1404  
  1405  func (s *testSerialSuite) TestCreateClusteredIndex(c *C) {
  1406  	tk := testkit.NewTestKitWithInit(c, s.causetstore)
  1407  	tk.Se.GetStochastikVars().EnableClusteredIndex = true
  1408  	tk.MustInterDirc("CREATE TABLE t1 (a int primary key, b int)")
  1409  	tk.MustInterDirc("CREATE TABLE t2 (a varchar(255) primary key, b int)")
  1410  	tk.MustInterDirc("CREATE TABLE t3 (a int, b int, c int, primary key (a, b))")
  1411  	tk.MustInterDirc("CREATE TABLE t4 (a int, b int, c int)")
  1412  	ctx := tk.Se.(stochastikctx.Context)
  1413  	is := petri.GetPetri(ctx).SchemaReplicant()
  1414  	tbl, err := is.BlockByName(perceptron.NewCIStr("test"), perceptron.NewCIStr("t1"))
  1415  	c.Assert(err, IsNil)
  1416  	c.Assert(tbl.Meta().PKIsHandle, IsTrue)
  1417  	c.Assert(tbl.Meta().IsCommonHandle, IsFalse)
  1418  	tbl, err = is.BlockByName(perceptron.NewCIStr("test"), perceptron.NewCIStr("t2"))
  1419  	c.Assert(err, IsNil)
  1420  	c.Assert(tbl.Meta().IsCommonHandle, IsTrue)
  1421  	tbl, err = is.BlockByName(perceptron.NewCIStr("test"), perceptron.NewCIStr("t3"))
  1422  	c.Assert(err, IsNil)
  1423  	c.Assert(tbl.Meta().IsCommonHandle, IsTrue)
  1424  	tbl, err = is.BlockByName(perceptron.NewCIStr("test"), perceptron.NewCIStr("t4"))
  1425  	c.Assert(err, IsNil)
  1426  	c.Assert(tbl.Meta().IsCommonHandle, IsFalse)
  1427  
  1428  	config.UFIDelateGlobal(func(conf *config.Config) {
  1429  		conf.AlterPrimaryKey = true
  1430  	})
  1431  	tk.MustInterDirc("CREATE TABLE t5 (a varchar(255) primary key, b int)")
  1432  	tk.MustInterDirc("CREATE TABLE t6 (a int, b int, c int, primary key (a, b))")
  1433  	is = petri.GetPetri(ctx).SchemaReplicant()
  1434  	tbl, err = is.BlockByName(perceptron.NewCIStr("test"), perceptron.NewCIStr("t5"))
  1435  	c.Assert(err, IsNil)
  1436  	c.Assert(tbl.Meta().IsCommonHandle, IsFalse)
  1437  	tbl, err = is.BlockByName(perceptron.NewCIStr("test"), perceptron.NewCIStr("t6"))
  1438  	c.Assert(err, IsNil)
  1439  	c.Assert(tbl.Meta().IsCommonHandle, IsFalse)
  1440  	config.UFIDelateGlobal(func(conf *config.Config) {
  1441  		conf.AlterPrimaryKey = false
  1442  	})
  1443  
  1444  	tk.MustInterDirc("CREATE TABLE t21 like t2")
  1445  	tk.MustInterDirc("CREATE TABLE t31 like t3")
  1446  	is = petri.GetPetri(ctx).SchemaReplicant()
  1447  	tbl, err = is.BlockByName(perceptron.NewCIStr("test"), perceptron.NewCIStr("t21"))
  1448  	c.Assert(err, IsNil)
  1449  	c.Assert(tbl.Meta().IsCommonHandle, IsTrue)
  1450  	tbl, err = is.BlockByName(perceptron.NewCIStr("test"), perceptron.NewCIStr("t31"))
  1451  	c.Assert(err, IsNil)
  1452  	c.Assert(tbl.Meta().IsCommonHandle, IsTrue)
  1453  
  1454  	tk.Se.GetStochastikVars().EnableClusteredIndex = false
  1455  	tk.MustInterDirc("CREATE TABLE t7 (a varchar(255) primary key, b int)")
  1456  	is = petri.GetPetri(ctx).SchemaReplicant()
  1457  	tbl, err = is.BlockByName(perceptron.NewCIStr("test"), perceptron.NewCIStr("t7"))
  1458  	c.Assert(err, IsNil)
  1459  	c.Assert(tbl.Meta().IsCommonHandle, IsFalse)
  1460  }
  1461  
  1462  func (s *testSerialSuite) TestCreateBlockNoBlock(c *C) {
  1463  	tk := testkit.NewTestKitWithInit(c, s.causetstore)
  1464  	c.Assert(failpoint.Enable("github.com/whtcorpsinc/milevadb/dbs/checkTenantCheckAllVersionsWaitTime", `return(true)`), IsNil)
  1465  	defer func() {
  1466  		c.Assert(failpoint.Disable("github.com/whtcorpsinc/milevadb/dbs/checkTenantCheckAllVersionsWaitTime"), IsNil)
  1467  	}()
  1468  	save := variable.GetDBSErrorCountLimit()
  1469  	variable.SetDBSErrorCountLimit(1)
  1470  	defer func() {
  1471  		variable.SetDBSErrorCountLimit(save)
  1472  	}()
  1473  
  1474  	tk.MustInterDirc("drop causet if exists t")
  1475  	_, err := tk.InterDirc("create causet t(a int)")
  1476  	c.Assert(err, NotNil)
  1477  }