Skip to content

Commit 061ef36

Browse files
committed
Fix a bug where target regions could miss the first record
This could happen with e.g. with `bcftools view -t` when the last record in a chromosome block has the same coordinate as the first record in the chromosome block that follows. Fixes samtools/bcftools#1441
1 parent 6038f97 commit 061ef36

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

synced_bcf_reader.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -614,7 +614,7 @@ static int _reader_fill_buffer(bcf_srs_t *files, bcf_sr_t *reader)
614614
}
615615
reader->nbuffer++;
616616

617-
if ( files->require_index==ALLOW_NO_IDX_ && reader->buffer[reader->nbuffer]->rid != reader->buffer[1]->rid ) break;
617+
if ( reader->buffer[reader->nbuffer]->rid != reader->buffer[1]->rid ) break;
618618
if ( reader->buffer[reader->nbuffer]->pos != reader->buffer[1]->pos ) break; // the buffer is full
619619
}
620620
if ( ret<0 )
@@ -638,11 +638,12 @@ static void _reader_shift_buffer(bcf_sr_t *reader)
638638
{
639639
int i;
640640
for (i=2; i<=reader->nbuffer; i++)
641-
if ( reader->buffer[i]->pos!=reader->buffer[1]->pos ) break;
641+
if ( reader->buffer[i]->rid!=reader->buffer[1]->rid || reader->buffer[i]->pos!=reader->buffer[1]->pos ) break;
642642
if ( i<=reader->nbuffer )
643643
{
644644
// A record with a different position follows, swap it. Because of the reader's logic,
645645
// only one such line can be present.
646+
assert( i==reader->nbuffer );
646647
bcf1_t *tmp = reader->buffer[1]; reader->buffer[1] = reader->buffer[i]; reader->buffer[i] = tmp;
647648
reader->nbuffer = 1;
648649
}

0 commit comments

Comments
 (0)