func (td *tableDeleter) deleteAllRowsScan( ctx context.Context, resume roachpb.Span, limit int64, ) (roachpb.Span, error) { if resume.Key == nil { tablePrefix := sqlbase.MakeIndexKeyPrefix( td.rd.helper.tableDesc, td.rd.helper.tableDesc.PrimaryIndex.ID) resume = roachpb.Span{Key: roachpb.Key(tablePrefix), EndKey: roachpb.Key(tablePrefix).PrefixEnd()} } valNeededForCol := make([]bool, len(td.rd.helper.tableDesc.Columns)) for _, idx := range td.rd.fetchColIDtoRowIndex { valNeededForCol[idx] = true } var rf sqlbase.RowFetcher err := rf.Init( td.rd.helper.tableDesc, td.rd.fetchColIDtoRowIndex, &td.rd.helper.tableDesc.PrimaryIndex, false, false, td.rd.fetchCols, valNeededForCol) if err != nil { return resume, err } if err := rf.StartScan(td.txn, roachpb.Spans{resume}, true /* limit batches */, 0); err != nil { return resume, err } for i := int64(0); i < limit; i++ { row, err := rf.NextRowDecoded() if err != nil { return resume, err } if row == nil { // Done deleting all rows. resume = roachpb.Span{} break } _, err = td.row(ctx, row) if err != nil { return resume, err } } if resume.Key != nil { // Update the resume start key for the next iteration. resume.Key = rf.Key() } return resume, td.finalize(ctx) }