github.com/whtcorpsinc/milevadb-prod@v0.0.0-20211104133533-f57f4be3b597/allegrosql/request_builder_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 allegrosql
    15  
    16  import (
    17  	"os"
    18  	"testing"
    19  
    20  	"github.com/whtcorpsinc/BerolinaSQL/allegrosql"
    21  	. "github.com/whtcorpsinc/check"
    22  	"github.com/whtcorpsinc/fidelpb/go-fidelpb"
    23  	"github.com/whtcorpsinc/milevadb/blockcodec"
    24  	"github.com/whtcorpsinc/milevadb/ekv"
    25  	"github.com/whtcorpsinc/milevadb/schemareplicant"
    26  	"github.com/whtcorpsinc/milevadb/soliton/chunk"
    27  	"github.com/whtcorpsinc/milevadb/soliton/codec"
    28  	"github.com/whtcorpsinc/milevadb/soliton/disk"
    29  	"github.com/whtcorpsinc/milevadb/soliton/logutil"
    30  	"github.com/whtcorpsinc/milevadb/soliton/memory"
    31  	"github.com/whtcorpsinc/milevadb/soliton/mock"
    32  	"github.com/whtcorpsinc/milevadb/soliton/ranger"
    33  	"github.com/whtcorpsinc/milevadb/soliton/testleak"
    34  	"github.com/whtcorpsinc/milevadb/statistics"
    35  	"github.com/whtcorpsinc/milevadb/stochastikctx"
    36  	"github.com/whtcorpsinc/milevadb/stochastikctx/stmtctx"
    37  	"github.com/whtcorpsinc/milevadb/stochastikctx/variable"
    38  	"github.com/whtcorpsinc/milevadb/types"
    39  )
    40  
    41  var _ = Suite(&testSuite{})
    42  
    43  func TestT(t *testing.T) {
    44  	CustomVerboseFlag = true
    45  	logLevel := os.Getenv("log_level")
    46  	logutil.InitLogger(logutil.NewLogConfig(logLevel, logutil.DefaultLogFormat, "", logutil.EmptyFileLogConfig, false))
    47  	TestingT(t)
    48  }
    49  
    50  var _ = Suite(&testSuite{})
    51  
    52  type testSuite struct {
    53  	sctx stochastikctx.Context
    54  }
    55  
    56  func (s *testSuite) SetUpSuite(c *C) {
    57  	ctx := mock.NewContext()
    58  	ctx.GetStochastikVars().StmtCtx = &stmtctx.StatementContext{
    59  		MemTracker:  memory.NewTracker(-1, -1),
    60  		DiskTracker: disk.NewTracker(-1, -1),
    61  	}
    62  	ctx.CausetStore = &mock.CausetStore{
    63  		Client: &mock.Client{
    64  			MockResponse: &mockResponse{
    65  				ctx:   ctx,
    66  				batch: 1,
    67  				total: 2,
    68  			},
    69  		},
    70  	}
    71  	s.sctx = ctx
    72  }
    73  
    74  func (s *testSuite) TearDownSuite(c *C) {
    75  }
    76  
    77  func (s *testSuite) SetUpTest(c *C) {
    78  	testleak.BeforeTest()
    79  	ctx := s.sctx.(*mock.Context)
    80  	causetstore := ctx.CausetStore.(*mock.CausetStore)
    81  	causetstore.Client = &mock.Client{
    82  		MockResponse: &mockResponse{
    83  			ctx:   ctx,
    84  			batch: 1,
    85  			total: 2,
    86  		},
    87  	}
    88  }
    89  
    90  func (s *testSuite) TearDownTest(c *C) {
    91  	testleak.AfterTest(c)()
    92  }
    93  
    94  type handleRange struct {
    95  	start int64
    96  	end   int64
    97  }
    98  
    99  func (s *testSuite) getExpectedRanges(tid int64, hrs []*handleRange) []ekv.KeyRange {
   100  	krs := make([]ekv.KeyRange, 0, len(hrs))
   101  	for _, hr := range hrs {
   102  		low := codec.EncodeInt(nil, hr.start)
   103  		high := codec.EncodeInt(nil, hr.end)
   104  		high = ekv.Key(high).PrefixNext()
   105  		startKey := blockcodec.EncodeRowKey(tid, low)
   106  		endKey := blockcodec.EncodeRowKey(tid, high)
   107  		krs = append(krs, ekv.KeyRange{StartKey: startKey, EndKey: endKey})
   108  	}
   109  	return krs
   110  }
   111  
   112  func (s *testSuite) TestBlockHandlesToKVRanges(c *C) {
   113  	handles := []ekv.Handle{ekv.IntHandle(0), ekv.IntHandle(2), ekv.IntHandle(3), ekv.IntHandle(4), ekv.IntHandle(5),
   114  		ekv.IntHandle(10), ekv.IntHandle(11), ekv.IntHandle(100), ekv.IntHandle(9223372036854775806), ekv.IntHandle(9223372036854775807)}
   115  
   116  	// Build expected key ranges.
   117  	hrs := make([]*handleRange, 0, len(handles))
   118  	hrs = append(hrs, &handleRange{start: 0, end: 0})
   119  	hrs = append(hrs, &handleRange{start: 2, end: 5})
   120  	hrs = append(hrs, &handleRange{start: 10, end: 11})
   121  	hrs = append(hrs, &handleRange{start: 100, end: 100})
   122  	hrs = append(hrs, &handleRange{start: 9223372036854775806, end: 9223372036854775807})
   123  
   124  	// Build key ranges.
   125  	expect := s.getExpectedRanges(1, hrs)
   126  	actual := BlockHandlesToKVRanges(1, handles)
   127  
   128  	// Compare key ranges and expected key ranges.
   129  	c.Assert(len(actual), Equals, len(expect))
   130  	for i := range actual {
   131  		c.Assert(actual[i].StartKey, DeepEquals, expect[i].StartKey)
   132  		c.Assert(actual[i].EndKey, DeepEquals, expect[i].EndKey)
   133  	}
   134  }
   135  
   136  func (s *testSuite) TestBlockRangesToKVRanges(c *C) {
   137  	ranges := []*ranger.Range{
   138  		{
   139  			LowVal:  []types.Causet{types.NewIntCauset(1)},
   140  			HighVal: []types.Causet{types.NewIntCauset(2)},
   141  		},
   142  		{
   143  			LowVal:      []types.Causet{types.NewIntCauset(2)},
   144  			HighVal:     []types.Causet{types.NewIntCauset(4)},
   145  			LowExclude:  true,
   146  			HighExclude: true,
   147  		},
   148  		{
   149  			LowVal:      []types.Causet{types.NewIntCauset(4)},
   150  			HighVal:     []types.Causet{types.NewIntCauset(19)},
   151  			HighExclude: true,
   152  		},
   153  		{
   154  			LowVal:     []types.Causet{types.NewIntCauset(19)},
   155  			HighVal:    []types.Causet{types.NewIntCauset(32)},
   156  			LowExclude: true,
   157  		},
   158  		{
   159  			LowVal:     []types.Causet{types.NewIntCauset(34)},
   160  			HighVal:    []types.Causet{types.NewIntCauset(34)},
   161  			LowExclude: true,
   162  		},
   163  	}
   164  
   165  	actual := BlockRangesToKVRanges(13, ranges, nil)
   166  	expect := []ekv.KeyRange{
   167  		{
   168  			StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1},
   169  			EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3},
   170  		},
   171  		{
   172  			StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3},
   173  			EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4},
   174  		},
   175  		{
   176  			StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4},
   177  			EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13},
   178  		},
   179  		{
   180  			StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14},
   181  			EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21},
   182  		},
   183  		{
   184  			StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23},
   185  			EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23},
   186  		},
   187  	}
   188  	for i := 0; i < len(actual); i++ {
   189  		c.Assert(actual[i], DeepEquals, expect[i])
   190  	}
   191  }
   192  
   193  func (s *testSuite) TestIndexRangesToKVRanges(c *C) {
   194  	ranges := []*ranger.Range{
   195  		{
   196  			LowVal:  []types.Causet{types.NewIntCauset(1)},
   197  			HighVal: []types.Causet{types.NewIntCauset(2)},
   198  		},
   199  		{
   200  			LowVal:      []types.Causet{types.NewIntCauset(2)},
   201  			HighVal:     []types.Causet{types.NewIntCauset(4)},
   202  			LowExclude:  true,
   203  			HighExclude: true,
   204  		},
   205  		{
   206  			LowVal:      []types.Causet{types.NewIntCauset(4)},
   207  			HighVal:     []types.Causet{types.NewIntCauset(19)},
   208  			HighExclude: true,
   209  		},
   210  		{
   211  			LowVal:     []types.Causet{types.NewIntCauset(19)},
   212  			HighVal:    []types.Causet{types.NewIntCauset(32)},
   213  			LowExclude: true,
   214  		},
   215  		{
   216  			LowVal:     []types.Causet{types.NewIntCauset(34)},
   217  			HighVal:    []types.Causet{types.NewIntCauset(34)},
   218  			LowExclude: true,
   219  		},
   220  	}
   221  
   222  	expect := []ekv.KeyRange{
   223  		{
   224  			StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1},
   225  			EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3},
   226  		},
   227  		{
   228  			StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3},
   229  			EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4},
   230  		},
   231  		{
   232  			StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4},
   233  			EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13},
   234  		},
   235  		{
   236  			StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14},
   237  			EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21},
   238  		},
   239  		{
   240  			StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23},
   241  			EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23},
   242  		},
   243  	}
   244  
   245  	actual, err := IndexRangesToKVRanges(new(stmtctx.StatementContext), 12, 15, ranges, nil)
   246  	c.Assert(err, IsNil)
   247  	for i := range actual {
   248  		c.Assert(actual[i], DeepEquals, expect[i])
   249  	}
   250  }
   251  
   252  func (s *testSuite) TestRequestBuilder1(c *C) {
   253  	ranges := []*ranger.Range{
   254  		{
   255  			LowVal:  []types.Causet{types.NewIntCauset(1)},
   256  			HighVal: []types.Causet{types.NewIntCauset(2)},
   257  		},
   258  		{
   259  			LowVal:      []types.Causet{types.NewIntCauset(2)},
   260  			HighVal:     []types.Causet{types.NewIntCauset(4)},
   261  			LowExclude:  true,
   262  			HighExclude: true,
   263  		},
   264  		{
   265  			LowVal:      []types.Causet{types.NewIntCauset(4)},
   266  			HighVal:     []types.Causet{types.NewIntCauset(19)},
   267  			HighExclude: true,
   268  		},
   269  		{
   270  			LowVal:     []types.Causet{types.NewIntCauset(19)},
   271  			HighVal:    []types.Causet{types.NewIntCauset(32)},
   272  			LowExclude: true,
   273  		},
   274  		{
   275  			LowVal:     []types.Causet{types.NewIntCauset(34)},
   276  			HighVal:    []types.Causet{types.NewIntCauset(34)},
   277  			LowExclude: true,
   278  		},
   279  	}
   280  
   281  	actual, err := (&RequestBuilder{}).SetBlockRanges(12, ranges, nil).
   282  		SetPosetDagRequest(&fidelpb.PosetDagRequest{}).
   283  		SetDesc(false).
   284  		SetKeepOrder(false).
   285  		SetFromStochastikVars(variable.NewStochastikVars()).
   286  		Build()
   287  	c.Assert(err, IsNil)
   288  	expect := &ekv.Request{
   289  		Tp:      103,
   290  		StartTs: 0x0,
   291  		Data:    []uint8{0x18, 0x0, 0x20, 0x0, 0x40, 0x0, 0x5a, 0x0},
   292  		KeyRanges: []ekv.KeyRange{
   293  			{
   294  				StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1},
   295  				EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3},
   296  			},
   297  			{
   298  				StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3},
   299  				EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4},
   300  			},
   301  			{
   302  				StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4},
   303  				EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13},
   304  			},
   305  			{
   306  				StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14},
   307  				EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21},
   308  			},
   309  			{
   310  				StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23},
   311  				EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23},
   312  			},
   313  		},
   314  		Cacheable:      true,
   315  		KeepOrder:      false,
   316  		Desc:           false,
   317  		Concurrency:    variable.DefDistALLEGROSQLScanConcurrency,
   318  		IsolationLevel: 0,
   319  		Priority:       0,
   320  		NotFillCache:   false,
   321  		SyncLog:        false,
   322  		Streaming:      false,
   323  		ReplicaRead:    ekv.ReplicaReadLeader,
   324  	}
   325  	c.Assert(actual, DeepEquals, expect)
   326  }
   327  
   328  func (s *testSuite) TestRequestBuilder2(c *C) {
   329  	ranges := []*ranger.Range{
   330  		{
   331  			LowVal:  []types.Causet{types.NewIntCauset(1)},
   332  			HighVal: []types.Causet{types.NewIntCauset(2)},
   333  		},
   334  		{
   335  			LowVal:      []types.Causet{types.NewIntCauset(2)},
   336  			HighVal:     []types.Causet{types.NewIntCauset(4)},
   337  			LowExclude:  true,
   338  			HighExclude: true,
   339  		},
   340  		{
   341  			LowVal:      []types.Causet{types.NewIntCauset(4)},
   342  			HighVal:     []types.Causet{types.NewIntCauset(19)},
   343  			HighExclude: true,
   344  		},
   345  		{
   346  			LowVal:     []types.Causet{types.NewIntCauset(19)},
   347  			HighVal:    []types.Causet{types.NewIntCauset(32)},
   348  			LowExclude: true,
   349  		},
   350  		{
   351  			LowVal:     []types.Causet{types.NewIntCauset(34)},
   352  			HighVal:    []types.Causet{types.NewIntCauset(34)},
   353  			LowExclude: true,
   354  		},
   355  	}
   356  
   357  	actual, err := (&RequestBuilder{}).SetIndexRanges(new(stmtctx.StatementContext), 12, 15, ranges).
   358  		SetPosetDagRequest(&fidelpb.PosetDagRequest{}).
   359  		SetDesc(false).
   360  		SetKeepOrder(false).
   361  		SetFromStochastikVars(variable.NewStochastikVars()).
   362  		Build()
   363  	c.Assert(err, IsNil)
   364  	expect := &ekv.Request{
   365  		Tp:      103,
   366  		StartTs: 0x0,
   367  		Data:    []uint8{0x18, 0x0, 0x20, 0x0, 0x40, 0x0, 0x5a, 0x0},
   368  		KeyRanges: []ekv.KeyRange{
   369  			{
   370  				StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1},
   371  				EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3},
   372  			},
   373  			{
   374  				StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3},
   375  				EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4},
   376  			},
   377  			{
   378  				StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4},
   379  				EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13},
   380  			},
   381  			{
   382  				StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14},
   383  				EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21},
   384  			},
   385  			{
   386  				StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23},
   387  				EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23},
   388  			},
   389  		},
   390  		Cacheable:      true,
   391  		KeepOrder:      false,
   392  		Desc:           false,
   393  		Concurrency:    variable.DefDistALLEGROSQLScanConcurrency,
   394  		IsolationLevel: 0,
   395  		Priority:       0,
   396  		NotFillCache:   false,
   397  		SyncLog:        false,
   398  		Streaming:      false,
   399  		ReplicaRead:    ekv.ReplicaReadLeader,
   400  	}
   401  	c.Assert(actual, DeepEquals, expect)
   402  }
   403  
   404  func (s *testSuite) TestRequestBuilder3(c *C) {
   405  	handles := []ekv.Handle{ekv.IntHandle(0), ekv.IntHandle(2), ekv.IntHandle(3), ekv.IntHandle(4),
   406  		ekv.IntHandle(5), ekv.IntHandle(10), ekv.IntHandle(11), ekv.IntHandle(100)}
   407  
   408  	actual, err := (&RequestBuilder{}).SetBlockHandles(15, handles).
   409  		SetPosetDagRequest(&fidelpb.PosetDagRequest{}).
   410  		SetDesc(false).
   411  		SetKeepOrder(false).
   412  		SetFromStochastikVars(variable.NewStochastikVars()).
   413  		Build()
   414  	c.Assert(err, IsNil)
   415  	expect := &ekv.Request{
   416  		Tp:      103,
   417  		StartTs: 0x0,
   418  		Data:    []uint8{0x18, 0x0, 0x20, 0x0, 0x40, 0x0, 0x5a, 0x0},
   419  		KeyRanges: []ekv.KeyRange{
   420  			{
   421  				StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
   422  				EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1},
   423  			},
   424  			{
   425  				StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2},
   426  				EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6},
   427  			},
   428  			{
   429  				StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa},
   430  				EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc},
   431  			},
   432  			{
   433  				StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x64},
   434  				EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65},
   435  			},
   436  		},
   437  		Cacheable:      true,
   438  		KeepOrder:      false,
   439  		Desc:           false,
   440  		Concurrency:    variable.DefDistALLEGROSQLScanConcurrency,
   441  		IsolationLevel: 0,
   442  		Priority:       0,
   443  		NotFillCache:   false,
   444  		SyncLog:        false,
   445  		Streaming:      false,
   446  		ReplicaRead:    ekv.ReplicaReadLeader,
   447  	}
   448  	c.Assert(actual, DeepEquals, expect)
   449  }
   450  
   451  func (s *testSuite) TestRequestBuilder4(c *C) {
   452  	keyRanges := []ekv.KeyRange{
   453  		{
   454  			StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
   455  			EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1},
   456  		},
   457  		{
   458  			StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2},
   459  			EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6},
   460  		},
   461  		{
   462  			StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa},
   463  			EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc},
   464  		},
   465  		{
   466  			StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x64},
   467  			EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65},
   468  		},
   469  	}
   470  
   471  	actual, err := (&RequestBuilder{}).SetKeyRanges(keyRanges).
   472  		SetPosetDagRequest(&fidelpb.PosetDagRequest{}).
   473  		SetDesc(false).
   474  		SetKeepOrder(false).
   475  		SetStreaming(true).
   476  		SetFromStochastikVars(variable.NewStochastikVars()).
   477  		Build()
   478  	c.Assert(err, IsNil)
   479  	expect := &ekv.Request{
   480  		Tp:             103,
   481  		StartTs:        0x0,
   482  		Data:           []uint8{0x18, 0x0, 0x20, 0x0, 0x40, 0x0, 0x5a, 0x0},
   483  		KeyRanges:      keyRanges,
   484  		Cacheable:      true,
   485  		KeepOrder:      false,
   486  		Desc:           false,
   487  		Concurrency:    variable.DefDistALLEGROSQLScanConcurrency,
   488  		IsolationLevel: 0,
   489  		Priority:       0,
   490  		Streaming:      true,
   491  		NotFillCache:   false,
   492  		SyncLog:        false,
   493  		ReplicaRead:    ekv.ReplicaReadLeader,
   494  	}
   495  	c.Assert(actual, DeepEquals, expect)
   496  }
   497  
   498  func (s *testSuite) TestRequestBuilder5(c *C) {
   499  	keyRanges := []ekv.KeyRange{
   500  		{
   501  			StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
   502  			EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1},
   503  		},
   504  		{
   505  			StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2},
   506  			EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6},
   507  		},
   508  		{
   509  			StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa},
   510  			EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc},
   511  		},
   512  		{
   513  			StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x64},
   514  			EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65},
   515  		},
   516  	}
   517  
   518  	actual, err := (&RequestBuilder{}).SetKeyRanges(keyRanges).
   519  		SetAnalyzeRequest(&fidelpb.AnalyzeReq{}).
   520  		SetKeepOrder(true).
   521  		SetConcurrency(15).
   522  		Build()
   523  	c.Assert(err, IsNil)
   524  	expect := &ekv.Request{
   525  		Tp:             104,
   526  		StartTs:        0x0,
   527  		Data:           []uint8{0x8, 0x0, 0x18, 0x0, 0x20, 0x0},
   528  		KeyRanges:      keyRanges,
   529  		KeepOrder:      true,
   530  		Desc:           false,
   531  		Concurrency:    15,
   532  		IsolationLevel: ekv.RC,
   533  		Priority:       1,
   534  		NotFillCache:   true,
   535  		SyncLog:        false,
   536  		Streaming:      false,
   537  	}
   538  	c.Assert(actual, DeepEquals, expect)
   539  }
   540  
   541  func (s *testSuite) TestRequestBuilder6(c *C) {
   542  	keyRanges := []ekv.KeyRange{
   543  		{
   544  			StartKey: ekv.Key{0x00, 0x01},
   545  			EndKey:   ekv.Key{0x02, 0x03},
   546  		},
   547  	}
   548  
   549  	concurrency := 10
   550  
   551  	actual, err := (&RequestBuilder{}).SetKeyRanges(keyRanges).
   552  		SetChecksumRequest(&fidelpb.ChecksumRequest{}).
   553  		SetConcurrency(concurrency).
   554  		Build()
   555  	c.Assert(err, IsNil)
   556  
   557  	expect := &ekv.Request{
   558  		Tp:             105,
   559  		StartTs:        0x0,
   560  		Data:           []uint8{0x10, 0x0, 0x18, 0x0},
   561  		KeyRanges:      keyRanges,
   562  		KeepOrder:      false,
   563  		Desc:           false,
   564  		Concurrency:    concurrency,
   565  		IsolationLevel: 0,
   566  		Priority:       0,
   567  		NotFillCache:   true,
   568  		SyncLog:        false,
   569  		Streaming:      false,
   570  	}
   571  
   572  	c.Assert(actual, DeepEquals, expect)
   573  }
   574  
   575  func (s *testSuite) TestRequestBuilder7(c *C) {
   576  	vars := variable.NewStochastikVars()
   577  	vars.SetReplicaRead(ekv.ReplicaReadFollower)
   578  
   579  	concurrency := 10
   580  
   581  	actual, err := (&RequestBuilder{}).
   582  		SetFromStochastikVars(vars).
   583  		SetConcurrency(concurrency).
   584  		Build()
   585  	c.Assert(err, IsNil)
   586  
   587  	expect := &ekv.Request{
   588  		Tp:             0,
   589  		StartTs:        0x0,
   590  		KeepOrder:      false,
   591  		Desc:           false,
   592  		Concurrency:    concurrency,
   593  		IsolationLevel: 0,
   594  		Priority:       0,
   595  		NotFillCache:   false,
   596  		SyncLog:        false,
   597  		Streaming:      false,
   598  		ReplicaRead:    ekv.ReplicaReadFollower,
   599  	}
   600  
   601  	c.Assert(actual, DeepEquals, expect)
   602  }
   603  
   604  func (s *testSuite) TestRequestBuilder8(c *C) {
   605  	sv := variable.NewStochastikVars()
   606  	sv.SnapshotschemaReplicant = schemareplicant.MockSchemaReplicantWithSchemaVer(nil, 10000)
   607  	actual, err := (&RequestBuilder{}).
   608  		SetFromStochastikVars(sv).
   609  		Build()
   610  	c.Assert(err, IsNil)
   611  	expect := &ekv.Request{
   612  		Tp:             0,
   613  		StartTs:        0x0,
   614  		Data:           []uint8(nil),
   615  		Concurrency:    variable.DefDistALLEGROSQLScanConcurrency,
   616  		IsolationLevel: 0,
   617  		Priority:       0,
   618  		MemTracker:     (*memory.Tracker)(nil),
   619  		ReplicaRead:    0x1,
   620  		SchemaVar:      10000,
   621  	}
   622  	c.Assert(actual, DeepEquals, expect)
   623  }
   624  
   625  func (s *testSuite) TestBlockRangesToKVRangesWithFbs(c *C) {
   626  	ranges := []*ranger.Range{
   627  		{
   628  			LowVal:  []types.Causet{types.NewIntCauset(1)},
   629  			HighVal: []types.Causet{types.NewIntCauset(4)},
   630  		},
   631  	}
   632  	hist := statistics.NewHistogram(1, 30, 30, 0, types.NewFieldType(allegrosql.TypeLonglong), chunk.InitialCapacity, 0)
   633  	for i := 0; i < 10; i++ {
   634  		hist.Bounds.AppendInt64(0, int64(i))
   635  		hist.Bounds.AppendInt64(0, int64(i+2))
   636  		hist.Buckets = append(hist.Buckets, statistics.Bucket{Repeat: 10, Count: int64(i + 30)})
   637  	}
   638  	fb := statistics.NewQueryFeedback(0, hist, 0, false)
   639  	lower, upper := types.NewIntCauset(2), types.NewIntCauset(3)
   640  	fb.Feedback = []statistics.Feedback{
   641  		{Lower: &lower, Upper: &upper, Count: 1, Repeat: 1},
   642  	}
   643  	actual := BlockRangesToKVRanges(0, ranges, fb)
   644  	expect := []ekv.KeyRange{
   645  		{
   646  			StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1},
   647  			EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5},
   648  		},
   649  	}
   650  	for i := 0; i < len(actual); i++ {
   651  		c.Assert(actual[i], DeepEquals, expect[i])
   652  	}
   653  }
   654  
   655  func (s *testSuite) TestIndexRangesToKVRangesWithFbs(c *C) {
   656  	ranges := []*ranger.Range{
   657  		{
   658  			LowVal:  []types.Causet{types.NewIntCauset(1)},
   659  			HighVal: []types.Causet{types.NewIntCauset(4)},
   660  		},
   661  	}
   662  	hist := statistics.NewHistogram(1, 30, 30, 0, types.NewFieldType(allegrosql.TypeLonglong), chunk.InitialCapacity, 0)
   663  	for i := 0; i < 10; i++ {
   664  		hist.Bounds.AppendInt64(0, int64(i))
   665  		hist.Bounds.AppendInt64(0, int64(i+2))
   666  		hist.Buckets = append(hist.Buckets, statistics.Bucket{Repeat: 10, Count: int64(i + 30)})
   667  	}
   668  	fb := statistics.NewQueryFeedback(0, hist, 0, false)
   669  	lower, upper := types.NewIntCauset(2), types.NewIntCauset(3)
   670  	fb.Feedback = []statistics.Feedback{
   671  		{Lower: &lower, Upper: &upper, Count: 1, Repeat: 1},
   672  	}
   673  	actual, err := IndexRangesToKVRanges(new(stmtctx.StatementContext), 0, 0, ranges, fb)
   674  	c.Assert(err, IsNil)
   675  	expect := []ekv.KeyRange{
   676  		{
   677  			StartKey: ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1},
   678  			EndKey:   ekv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5},
   679  		},
   680  	}
   681  	for i := 0; i < len(actual); i++ {
   682  		c.Assert(actual[i], DeepEquals, expect[i])
   683  	}
   684  }
   685  
   686  func (s *testSuite) TestScanLimitConcurrency(c *C) {
   687  	vars := variable.NewStochastikVars()
   688  	for _, tt := range []struct {
   689  		tp          fidelpb.InterDircType
   690  		limit       uint64
   691  		concurrency int
   692  	}{
   693  		{fidelpb.InterDircType_TypeBlockScan, 1, 1},
   694  		{fidelpb.InterDircType_TypeIndexScan, 1, 1},
   695  		{fidelpb.InterDircType_TypeBlockScan, 1000000, vars.Concurrency.DistALLEGROSQLScanConcurrency()},
   696  		{fidelpb.InterDircType_TypeIndexScan, 1000000, vars.Concurrency.DistALLEGROSQLScanConcurrency()},
   697  	} {
   698  		firstInterDirc := &fidelpb.InterlockingDirectorate{Tp: tt.tp}
   699  		switch tt.tp {
   700  		case fidelpb.InterDircType_TypeBlockScan:
   701  			firstInterDirc.TblScan = &fidelpb.BlockScan{}
   702  		case fidelpb.InterDircType_TypeIndexScan:
   703  			firstInterDirc.IdxScan = &fidelpb.IndexScan{}
   704  		}
   705  		limitInterDirc := &fidelpb.InterlockingDirectorate{Tp: fidelpb.InterDircType_TypeLimit, Limit: &fidelpb.Limit{Limit: tt.limit}}
   706  		posetPosetDag := &fidelpb.PosetDagRequest{InterlockingDirectorates: []*fidelpb.InterlockingDirectorate{firstInterDirc, limitInterDirc}}
   707  		actual, err := (&RequestBuilder{}).
   708  			SetPosetDagRequest(posetPosetDag).
   709  			SetFromStochastikVars(vars).
   710  			Build()
   711  		c.Assert(err, IsNil)
   712  		c.Assert(actual.Concurrency, Equals, tt.concurrency)
   713  	}
   714  }