code: func splitTableRanges(t table.PhysicalTable, store kv.Storage, startHandle, endHandle int64) ([]kv.KeyRange, error) {
  	startRecordKey := t.RecordKey(startHandle)
  	endRecordKey := t.RecordKey(endHandle).Next()
  
  	logutil.Logger(ddlLogCtx).Info("[ddl] split table range from PD", zap.Int64("physicalTableID", t.GetPhysicalID()), zap.Int64("startHandle", startHandle), zap.Int64("endHandle", endHandle))
  	kvRange := kv.KeyRange{StartKey: startRecordKey, EndKey: endRecordKey}
  	s, ok := store.(tikv.Storage)
  	if !ok {
  		// Only support split ranges in tikv.Storage now.
  		return []kv.KeyRange{kvRange}, nil
  	}
  
  	maxSleep := 10000 // ms
  	bo := tikv.NewBackoffer(context.Background(), maxSleep)
  	ranges, err := tikv.SplitRegionRanges(bo, s.GetRegionCache(), []kv.KeyRange{kvRange})
  	if err != nil {
  		return nil, errors.Trace(err)
  	}
  	if len(ranges) == 0 {
  		return nil, errors.Trace(errInvalidSplitRegionRanges)
  	}
  	return ranges, nil
  }
docs: // splitTableRanges uses PD region's key ranges to split the backfilling table key range space,
  // to speed up adding index in table with disperse handle.
  // The `t` should be a non-partitioned table or a partition.