code: func (l *LiteBackend) GetRange(ctx context.Context, startKey []byte, endKey []byte, limit int) (*backend.GetResult, error) {
  	if len(startKey) == 0 {
  		return nil, trace.BadParameter("missing parameter startKey")
  	}
  	if len(endKey) == 0 {
  		return nil, trace.BadParameter("missing parameter endKey")
  	}
  	if limit <= 0 {
  		limit = backend.DefaultLargeLimit
  	}
  	var result backend.GetResult
  	now := l.clock.Now().UTC()
  	err := l.inTransaction(ctx, func(tx *sql.Tx) error {
  		q, err := tx.PrepareContext(ctx,
  			"SELECT key, value, expires, modified FROM kv WHERE (key >= ? and key <= ?) AND (expires is NULL or expires > ?) ORDER BY key LIMIT ?")
  		if err != nil {
  			return trace.Wrap(err)
  		}
  		rows, err := q.QueryContext(ctx, string(startKey), string(endKey), now, limit)
  		if err != nil {
  			return trace.Wrap(err)
  		}
  		defer rows.Close()
  
  		for rows.Next() {
  			var i backend.Item
  			var expires NullTime
  			if err := rows.Scan(&i.Key, &i.Value, &expires, &i.ID); err != nil {
  				return trace.Wrap(err)
  			}
  			i.Expires = expires.Time
  			result.Items = append(result.Items, i)
  		}
  		return nil
  	})
  	if err != nil {
  		return nil, trace.Wrap(err)
  	}
  	return &result, nil
  }
docs: // GetRange returns query range