Skip to content

Commit ebb43b5

Browse files
committed
fix: compare_prefixed_slice, closes #211
1 parent e0364c3 commit ebb43b5

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

src/table/util.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -144,13 +144,19 @@ pub fn compare_prefixed_slice(prefix: &[u8], suffix: &[u8], needle: &[u8]) -> st
144144

145145
{
146146
#[expect(unsafe_code, reason = "We checked for max_pfx_len")]
147-
let prefix = unsafe { prefix.get_unchecked(0..max_pfx_len) };
147+
let prefix_truncated = unsafe { prefix.get_unchecked(0..max_pfx_len) };
148148

149149
#[expect(unsafe_code, reason = "We checked for max_pfx_len")]
150-
let needle = unsafe { needle.get_unchecked(0..max_pfx_len) };
150+
let needle_truncated = unsafe { needle.get_unchecked(0..max_pfx_len) };
151151

152-
match prefix.cmp(needle) {
153-
Equal => {}
152+
match prefix_truncated.cmp(needle_truncated) {
153+
Equal => {
154+
let rest_len = prefix.len().saturating_sub(needle.len());
155+
156+
if rest_len > 0 {
157+
return Greater;
158+
}
159+
}
154160
ordering => return ordering,
155161
}
156162
}
@@ -185,6 +191,8 @@ mod tests {
185191
fn test_compare_prefixed_slice() {
186192
use std::cmp::Ordering::{Equal, Greater, Less};
187193

194+
assert_eq!(Greater, compare_prefixed_slice(&[0, 161], &[], &[0]));
195+
188196
assert_eq!(Equal, compare_prefixed_slice(b"abc", b"xyz", b"abcxyz"));
189197
assert_eq!(Equal, compare_prefixed_slice(b"abc", b"", b"abc"));
190198
assert_eq!(Equal, compare_prefixed_slice(b"abc", b"abc", b"abcabc"));

0 commit comments

Comments
 (0)