func (rs *localRegion) getIndexRowFromRange(ctx *selectContext, ran kv.KeyRange, desc bool, limit int64) (count int64, err error) { idxInfo := ctx.sel.IndexInfo txn := ctx.txn var seekKey kv.Key if desc { seekKey = ran.EndKey } else { seekKey = ran.StartKey } ids := make([]int64, len(idxInfo.Columns)) for i, col := range idxInfo.Columns { ids[i] = col.GetColumnId() } for { if limit == 0 { break } var it kv.Iterator if desc { it, err = txn.SeekReverse(seekKey) if err != nil { return 0, errors.Trace(err) } seekKey = it.Key() } else { it, err = txn.Seek(seekKey) if err != nil { return 0, errors.Trace(err) } seekKey = it.Key().PrefixNext() } if !it.Valid() { break } if desc { if it.Key().Cmp(ran.StartKey) < 0 { break } } else { if it.Key().Cmp(ran.EndKey) >= 0 { break } } values, b, err1 := tablecodec.CutIndexKey(it.Key(), ids) if err1 != nil { return 0, errors.Trace(err1) } var handle int64 if len(b) > 0 { var handleDatum types.Datum _, handleDatum, err = codec.DecodeOne(b) if err != nil { return 0, errors.Trace(err) } handle = handleDatum.GetInt64() } else { handle, err = decodeHandle(it.Value()) if err != nil { return 0, errors.Trace(err) } } gotRow, err := rs.valuesToRow(ctx, handle, values) if err != nil { return 0, errors.Trace(err) } if gotRow { limit-- count++ } } return count, nil }
func getIndexRowFromRange(idxInfo *tipb.IndexInfo, txn kv.Transaction, ran kv.KeyRange, desc bool, limit int64) ([]*tipb.Row, error) { var rows []*tipb.Row var seekKey kv.Key if desc { seekKey = ran.EndKey } else { seekKey = ran.StartKey } for { if limit == 0 { break } var it kv.Iterator var err error if desc { it, err = txn.SeekReverse(seekKey) if err != nil { return nil, errors.Trace(err) } seekKey = it.Key() } else { it, err = txn.Seek(seekKey) if err != nil { return nil, errors.Trace(err) } seekKey = it.Key().PrefixNext() } if !it.Valid() { break } if desc { if it.Key().Cmp(ran.StartKey) < 0 { break } } else { if it.Key().Cmp(ran.EndKey) >= 0 { break } } datums, err := tablecodec.DecodeIndexKey(it.Key()) if err != nil { return nil, errors.Trace(err) } var handle types.Datum if len(datums) > len(idxInfo.Columns) { handle = datums[len(idxInfo.Columns)] datums = datums[:len(idxInfo.Columns)] } else { var intHandle int64 intHandle, err = decodeHandle(it.Value()) if err != nil { return nil, errors.Trace(err) } handle.SetInt64(intHandle) } data, err := codec.EncodeValue(nil, datums...) if err != nil { return nil, errors.Trace(err) } handleData, err := codec.EncodeValue(nil, handle) if err != nil { return nil, errors.Trace(err) } row := &tipb.Row{Handle: handleData, Data: data} rows = append(rows, row) limit-- } return rows, nil }
func (rs *localRegion) getRowsFromRange(ctx *selectContext, ran kv.KeyRange, limit int64, desc bool) (count int64, err error) { if limit == 0 { return 0, nil } if ran.IsPoint() { var value []byte value, err = ctx.txn.Get(ran.StartKey) if terror.ErrorEqual(err, kv.ErrNotExist) { return 0, nil } else if err != nil { return 0, errors.Trace(err) } var h int64 h, err = tablecodec.DecodeRowKey(ran.StartKey) if err != nil { return 0, errors.Trace(err) } gotRow, err1 := rs.handleRowData(ctx, h, value) if err1 != nil { return 0, errors.Trace(err1) } if gotRow { count++ } return } var seekKey kv.Key if desc { seekKey = ran.EndKey } else { seekKey = ran.StartKey } for { if limit == 0 { break } var ( it kv.Iterator err error ) if desc { it, err = ctx.txn.SeekReverse(seekKey) } else { it, err = ctx.txn.Seek(seekKey) } if err != nil { return 0, errors.Trace(err) } if !it.Valid() { break } if desc { if it.Key().Cmp(ran.StartKey) < 0 { break } seekKey = tablecodec.TruncateToRowKeyLen(it.Key()) } else { if it.Key().Cmp(ran.EndKey) >= 0 { break } seekKey = it.Key().PrefixNext() } h, err := tablecodec.DecodeRowKey(it.Key()) if err != nil { return 0, errors.Trace(err) } gotRow, err := rs.handleRowData(ctx, h, it.Value()) if err != nil { return 0, errors.Trace(err) } if gotRow { limit-- count++ } } return count, nil }
func (rs *localRegion) getRowsFromRange(ctx *selectContext, ran kv.KeyRange, limit int64, desc bool) ([]*tipb.Row, error) { if limit == 0 { return nil, nil } var rows []*tipb.Row if ran.IsPoint() { _, err := ctx.txn.Get(ran.StartKey) if terror.ErrorEqual(err, kv.ErrNotExist) { return nil, nil } else if err != nil { return nil, errors.Trace(err) } h, err := tablecodec.DecodeRowKey(ran.StartKey) if err != nil { return nil, errors.Trace(err) } match, err := rs.evalWhereForRow(ctx, h) if err != nil { return nil, errors.Trace(err) } if !match { return nil, nil } row, err := rs.getRowByHandle(ctx, h) if err != nil { return nil, errors.Trace(err) } if row != nil { rows = append(rows, row) } return rows, nil } var seekKey kv.Key if desc { seekKey = ran.EndKey } else { seekKey = ran.StartKey } for { if limit == 0 { break } var ( it kv.Iterator err error ) if desc { it, err = ctx.txn.SeekReverse(seekKey) } else { it, err = ctx.txn.Seek(seekKey) } if err != nil { return nil, errors.Trace(err) } if !it.Valid() { break } if desc { if it.Key().Cmp(ran.StartKey) < 0 { break } seekKey = tablecodec.TruncateToRowKeyLen(it.Key()) } else { if it.Key().Cmp(ran.EndKey) >= 0 { break } seekKey = it.Key().PrefixNext() } h, err := tablecodec.DecodeRowKey(it.Key()) if err != nil { return nil, errors.Trace(err) } match, err := rs.evalWhereForRow(ctx, h) if err != nil { return nil, errors.Trace(err) } if !match { continue } row, err := rs.getRowByHandle(ctx, h) if err != nil { return nil, errors.Trace(err) } if row != nil { rows = append(rows, row) limit-- } } return rows, nil }