// EncodeTableRanges encodes table ranges into kv.KeyRanges. func EncodeTableRanges(tid int64, rans []*tipb.KeyRange) []kv.KeyRange { keyRanges := make([]kv.KeyRange, 0, len(rans)) for _, r := range rans { start := tablecodec.EncodeRowKey(tid, r.Low) end := tablecodec.EncodeRowKey(tid, r.High) nr := kv.KeyRange{ StartKey: start, EndKey: end, } keyRanges = append(keyRanges, nr) } return keyRanges }
// extractKVRanges extracts kv.KeyRanges slice from a SelectRequest, and also returns if it is in descending order. func (rs *localRegion) extractKVRanges(sel *tipb.SelectRequest) (kvRanges []kv.KeyRange, desc bool) { var ( tid int64 idxID int64 ) if sel.IndexInfo != nil { tid = sel.IndexInfo.GetTableId() idxID = sel.IndexInfo.GetIndexId() } else { tid = sel.TableInfo.GetTableId() } for _, kran := range sel.Ranges { var upperKey, lowerKey kv.Key if idxID == 0 { upperKey = tablecodec.EncodeRowKey(tid, kran.GetHigh()) if bytes.Compare(upperKey, rs.startKey) <= 0 { continue } lowerKey = tablecodec.EncodeRowKey(tid, kran.GetLow()) } else { upperKey = tablecodec.EncodeIndexSeekKey(tid, idxID, kran.GetHigh()) if bytes.Compare(upperKey, rs.startKey) <= 0 { continue } lowerKey = tablecodec.EncodeIndexSeekKey(tid, idxID, kran.GetLow()) } if bytes.Compare(lowerKey, rs.endKey) >= 0 { break } var kvr kv.KeyRange if bytes.Compare(lowerKey, rs.startKey) <= 0 { kvr.StartKey = rs.startKey } else { kvr.StartKey = lowerKey } if bytes.Compare(upperKey, rs.endKey) <= 0 { kvr.EndKey = upperKey } else { kvr.EndKey = rs.endKey } kvRanges = append(kvRanges, kvr) } if sel.OrderBy != nil { desc = *sel.OrderBy[0].Desc } if desc { reverseKVRanges(kvRanges) } return }
func setRow(txn kv.Transaction, handle int64, tbl *simpleTableInfo, gen genValueFunc) error { rowKey := tablecodec.EncodeRowKey(tbl.tID, codec.EncodeInt(nil, handle)) columnValues := gen(handle, tbl) value, err := tablecodec.EncodeRow(columnValues, tbl.cIDs) if err != nil { return errors.Trace(err) } err = txn.Set(rowKey, value) if err != nil { return errors.Trace(err) } for i, idxCol := range tbl.indices { idxVal := columnValues[idxCol] encoded, err := codec.EncodeKey(nil, idxVal, types.NewDatum(handle)) if err != nil { return errors.Trace(err) } idxKey := tablecodec.EncodeIndexSeekKey(tbl.tID, tbl.iIDs[i], encoded) err = txn.Set(idxKey, []byte{0}) if err != nil { return errors.Trace(err) } } return nil }
// extractKVRanges extracts kv.KeyRanges slice from a SelectRequest, and also returns if it is in descending order. func (h *rpcHandler) extractKVRanges(sel *tipb.SelectRequest) (kvRanges []kv.KeyRange, desc bool) { var ( tid int64 idxID int64 ) if sel.IndexInfo != nil { tid = sel.IndexInfo.GetTableId() idxID = sel.IndexInfo.GetIndexId() } else { tid = sel.TableInfo.GetTableId() } for _, kran := range sel.Ranges { var upperKey, lowerKey kv.Key if idxID == 0 { upperKey = tablecodec.EncodeRowKey(tid, kran.GetHigh()) if bytes.Compare(upperKey, h.startKey) <= 0 { continue } lowerKey = tablecodec.EncodeRowKey(tid, kran.GetLow()) } else { upperKey = tablecodec.EncodeIndexSeekKey(tid, idxID, kran.GetHigh()) if bytes.Compare(upperKey, h.startKey) <= 0 { continue } lowerKey = tablecodec.EncodeIndexSeekKey(tid, idxID, kran.GetLow()) } if len(h.endKey) != 0 && bytes.Compare([]byte(lowerKey), h.endKey) >= 0 { break } var kvr kv.KeyRange kvr.StartKey = kv.Key(maxStartKey(lowerKey, h.startKey)) kvr.EndKey = kv.Key(minEndKey(upperKey, h.endKey)) kvRanges = append(kvRanges, kvr) } if sel.OrderBy != nil { desc = *sel.OrderBy[0].Desc } if desc { reverseKVRanges(kvRanges) } return }
func fullTableRange(tid int64) kv.KeyRange { return kv.KeyRange{ StartKey: tablecodec.EncodeRowKey(tid, codec.EncodeInt(nil, math.MinInt64)), EndKey: tablecodec.EncodeRowKey(tid, codec.EncodeInt(nil, math.MaxInt64)), } }
func (s *testSuite) testIndex(c *C, tb table.Table, idx table.Index) { txn, err := s.store.Begin() c.Assert(err, IsNil) err = CompareIndexData(txn, tb, idx) c.Assert(err, IsNil) cnt, err := GetIndexRecordsCount(txn, idx, nil) c.Assert(err, IsNil) c.Assert(cnt, Equals, int64(2)) // set data to: // index data (handle, data): (1, 10), (2, 20), (3, 30) // table data (handle, data): (1, 10), (2, 20), (4, 40) err = idx.Create(txn, types.MakeDatums(int64(30)), 3) c.Assert(err, IsNil) key := tablecodec.EncodeRowKey(tb.Meta().ID, codec.EncodeInt(nil, 4)) setColValue(c, txn, key, types.NewDatum(int64(40))) err = txn.Commit() c.Assert(err, IsNil) txn, err = s.store.Begin() c.Assert(err, IsNil) err = CompareIndexData(txn, tb, idx) c.Assert(err, NotNil) record1 := &RecordData{Handle: int64(3), Values: types.MakeDatums(int64(30))} diffMsg := newDiffRetError("index", record1, nil) c.Assert(err.Error(), DeepEquals, diffMsg) // set data to: // index data (handle, data): (1, 10), (2, 20), (3, 30), (4, 40) // table data (handle, data): (1, 10), (2, 20), (4, 40), (3, 31) err = idx.Create(txn, types.MakeDatums(int64(40)), 4) c.Assert(err, IsNil) key = tablecodec.EncodeRowKey(tb.Meta().ID, codec.EncodeInt(nil, 3)) setColValue(c, txn, key, types.NewDatum(int64(31))) err = txn.Commit() c.Assert(err, IsNil) txn, err = s.store.Begin() c.Assert(err, IsNil) err = CompareIndexData(txn, tb, idx) c.Assert(err, NotNil) record2 := &RecordData{Handle: int64(3), Values: types.MakeDatums(int64(31))} diffMsg = newDiffRetError("index", record1, record2) c.Assert(err.Error(), DeepEquals, diffMsg) // set data to: // index data (handle, data): (1, 10), (2, 20), (3, 30), (4, 40) // table data (handle, data): (1, 10), (2, 20), (4, 40), (5, 30) key = tablecodec.EncodeRowKey(tb.Meta().ID, codec.EncodeInt(nil, 3)) txn.Delete(key) key = tablecodec.EncodeRowKey(tb.Meta().ID, codec.EncodeInt(nil, 5)) setColValue(c, txn, key, types.NewDatum(int64(30))) err = txn.Commit() c.Assert(err, IsNil) txn, err = s.store.Begin() c.Assert(err, IsNil) err = checkRecordAndIndex(txn, tb, idx) c.Assert(err, NotNil) record2 = &RecordData{Handle: int64(5), Values: types.MakeDatums(int64(30))} diffMsg = newDiffRetError("index", record1, record2) c.Assert(err.Error(), DeepEquals, diffMsg) // set data to: // index data (handle, data): (1, 10), (2, 20), (3, 30), (4, 40) // table data (handle, data): (1, 10), (2, 20), (3, 30) key = tablecodec.EncodeRowKey(tb.Meta().ID, codec.EncodeInt(nil, 4)) txn.Delete(key) key = tablecodec.EncodeRowKey(tb.Meta().ID, codec.EncodeInt(nil, 3)) setColValue(c, txn, key, types.NewDatum(int64(30))) err = txn.Commit() c.Assert(err, IsNil) txn, err = s.store.Begin() c.Assert(err, IsNil) err = CompareIndexData(txn, tb, idx) c.Assert(err, NotNil) record1 = &RecordData{Handle: int64(4), Values: types.MakeDatums(int64(40))} diffMsg = newDiffRetError("index", record1, nil) c.Assert(err.Error(), DeepEquals, diffMsg) // set data to: // index data (handle, data): (1, 10), (2, 20), (3, 30) // table data (handle, data): (1, 10), (2, 20), (3, 30), (4, 40) err = idx.Delete(txn, types.MakeDatums(int64(40)), 4) c.Assert(err, IsNil) key = tablecodec.EncodeRowKey(tb.Meta().ID, codec.EncodeInt(nil, 4)) setColValue(c, txn, key, types.NewDatum(int64(40))) err = txn.Commit() c.Assert(err, IsNil) txn, err = s.store.Begin() c.Assert(err, IsNil) err = CompareIndexData(txn, tb, idx) c.Assert(err, NotNil) diffMsg = newDiffRetError("index", nil, record1) c.Assert(err.Error(), DeepEquals, diffMsg) }