diff --git a/roaring/roaring.go b/roaring/roaring.go index 16e6159d7..266a9bfe3 100644 --- a/roaring/roaring.go +++ b/roaring/roaring.go @@ -3218,9 +3218,14 @@ func xorCompare(x *xorstm) (r1 interval16, has_data bool) { r1 = interval16{start: x.va.start, last: x.vb.start - 1} has_data = true } - x.va.start = x.vb.last + 1 - if x.va.start > x.va.last { + if x.vb.last == 65535 { x.va_valid = false + + } else { + x.va.start = x.vb.last + 1 + if x.va.start > x.va.last { + x.va_valid = false + } } } else if x.vb.start <= x.va.start && x.vb.last >= x.va.last { //va inside @@ -3230,26 +3235,39 @@ func xorCompare(x *xorstm) (r1 interval16, has_data bool) { has_data = true } - x.vb.start = x.va.last + 1 - if x.vb.start > x.vb.last { + if x.va.last == 65535 { x.vb_valid = false + } else { + x.vb.start = x.va.last + 1 + if x.vb.start > x.vb.last { + x.vb_valid = false + } } } else if x.va.start < x.vb.start && x.va.last <= x.vb.last { //va first overlap x.va_valid = false r1 = interval16{start: x.va.start, last: x.vb.start - 1} has_data = true - x.vb.start = x.va.last + 1 - if x.vb.start > x.vb.last { + if x.va.last == 65535 { x.vb_valid = false + } else { + x.vb.start = x.va.last + 1 + if x.vb.start > x.vb.last { + x.vb_valid = false + } } } else if x.vb.start < x.va.start && x.vb.last <= x.va.last { //vb first overlap x.vb_valid = false r1 = interval16{start: x.vb.start, last: x.va.start - 1} has_data = true - x.va.start = x.vb.last + 1 - if x.va.start > x.va.last { + + if x.vb.last == 65535 { x.va_valid = false + } else { + x.va.start = x.vb.last + 1 + if x.va.start > x.va.last { + x.va_valid = false + } } } return diff --git a/roaring/roaring_internal_test.go b/roaring/roaring_internal_test.go index 59db885e1..74dcc8992 100644 --- a/roaring/roaring_internal_test.go +++ b/roaring/roaring_internal_test.go @@ -1834,8 +1834,8 @@ func TestXorRunRun(t *testing.T) { }, { aruns: []interval16{{start: 65530, last: 65535}}, - bruns: []interval16{{start: 65531, last: 65535}}, - exp: []interval16{{start: 65530, last: 65530}}, + bruns: []interval16{{start: 65532, last: 65535}}, + exp: []interval16{{start: 65530, last: 65531}}, }, } for i, test := range tests {