safety warning

main
Ziyang Hu 2 years ago
parent eb8c4311af
commit b4e33af5c2

@ -431,8 +431,11 @@ impl<'a> IteratorPtr<'a> {
pub fn seek_for_prev(&self, key: impl AsRef<[u8]>) {
IteratorBridge::do_seek_for_prev(self, key.as_ref())
}
#[inline]
pub fn key(&self) -> Option<SlicePtr> {
/// # Safety
/// `next()` must not be called on the iterator when the returned value is still used
pub unsafe fn key(&self) -> Option<SlicePtr> {
if self.is_valid() {
Some(SlicePtr::Plain(IteratorBridge::key_raw(self)))
} else {
@ -440,7 +443,9 @@ impl<'a> IteratorPtr<'a> {
}
}
#[inline]
pub fn val(&self) -> Option<SlicePtr> {
/// # Safety
/// `next()` must not be called on the iterator when the returned value is still used
pub unsafe fn val(&self) -> Option<SlicePtr> {
if self.is_valid() {
Some(SlicePtr::Plain(IteratorBridge::value_raw(self)))
} else {
@ -448,7 +453,9 @@ impl<'a> IteratorPtr<'a> {
}
}
#[inline]
pub fn pair(&self) -> Option<(SlicePtr, SlicePtr)> {
/// # Safety
/// `next()` must not be called on the iterator when the returned value is still used
pub unsafe fn pair(&self) -> Option<(SlicePtr, SlicePtr)> {
if self.is_valid() {
Some((SlicePtr::Plain(IteratorBridge::key_raw(self)),
SlicePtr::Plain(IteratorBridge::value_raw(self))))

@ -285,7 +285,7 @@ impl<'s> Session<'s> {
let it = self.txn.iterator(true, &self.perm_cf);
it.seek(&prefix);
while let Some(val) = it.key() {
while let Some(val) = unsafe { it.key() } {
let cur = Tuple::new(val);
if !cur.starts_with(&prefix) {
break;
@ -301,7 +301,7 @@ impl<'s> Session<'s> {
let it = self.txn.iterator(false, &self.temp_cf);
it.seek(&prefix);
while let Some(val) = it.key() {
while let Some(val) = unsafe { it.key() } {
let cur = Tuple::new(val);
if !cur.starts_with(&prefix) {
break;
@ -325,7 +325,7 @@ impl<'s> Session<'s> {
} else {
let it = self.txn.iterator(false, &self.temp_cf);
it.seek(&key);
if let Some(found_key) = it.key() {
if let Some(found_key) = unsafe { it.key() } {
let found_key_tuple = Tuple::new(found_key);
if found_key_tuple.starts_with(&key) {
let mut ikey = Tuple::with_null_prefix();

@ -241,7 +241,7 @@ mod tests {
}
let it = sess.txn.iterator(true, &sess.perm_cf);
it.to_first();
while let Some((key, val)) = it.pair() {
while let Some((key, val)) = unsafe { it.pair() } {
println!("a: {:?} {:?}", key.as_ref(), val.as_ref());
println!("v: {:?} {:?}", Tuple::new(key), Tuple::new(val));
it.next();

@ -100,7 +100,7 @@ impl<'s> Session<'s> {
let it = self.txn.iterator(false, &self.temp_cf);
it.seek(&prefix);
let mut to_delete = vec![];
while let Some(val) = it.key() {
while let Some(val) = unsafe { it.key() } {
let cur = Tuple::new(val);
if cur.starts_with(&prefix) {
if let Some(name) = cur.get(1) {
@ -142,7 +142,7 @@ impl<'s> Session<'s> {
prefix.push_int(self.stack_depth as i64);
let it = self.txn.iterator(false, &self.temp_cf);
it.seek(&prefix);
while let Some(val) = it.key() {
while let Some(val) = unsafe { it.key() } {
let cur = Tuple::new(val);
if cur.starts_with(&prefix) {
let mut ikey = Tuple::with_prefix(cur.get_prefix());
@ -177,7 +177,7 @@ impl<'s> Session<'s> {
tuple.push_str(name);
let it = self.txn.iterator(false, &self.temp_cf);
it.seek(&tuple);
if let Some((tk, vk)) = it.pair() {
if let Some((tk, vk)) = unsafe { it.pair() } {
let k = Tuple::new(tk);
if k.starts_with(&tuple) {
return Ok(Some(Tuple::new(vk)));

@ -1240,14 +1240,14 @@ mod tests {
let it = env.txn.iterator(false, &env.perm_cf);
it.to_first();
while let Some((k, v)) = it.pair() {
while let Some((k, v)) = unsafe { it.pair() } {
println!("{:?}, {:?}", Tuple::new(k), Tuple::new(v));
it.next();
}
let it = env.txn.iterator(false, &env.temp_cf);
it.to_first();
while let Some((k, v)) = it.pair() {
while let Some((k, v)) = unsafe { it.pair() } {
println!("{:?}, {:?}", Tuple::new(k), Tuple::new(v));
it.next();
}

@ -5,7 +5,7 @@ use cozorocks::IteratorPtr;
use crate::db::eval::{compare_tuple_by_keys, tuple_eval};
use crate::db::table::{ColId, TableId};
use crate::error::CozoError::LogicError;
use crate::error::{CozoError, Result};
use crate::error::{Result};
use crate::relation::data::{DataKind, EMPTY_DATA};
use crate::relation::table::MegaTuple;
use crate::relation::tuple::{CowSlice, CowTuple, OwnTuple, Tuple};
@ -404,12 +404,14 @@ impl<'a> Iterator for NodeIterator<'a> {
} else {
self.started = true;
}
self.it.pair().map(|(k, v)| {
Ok(MegaTuple {
keys: vec![Tuple::new(k).into()],
vals: vec![Tuple::new(v).into()],
unsafe {
self.it.pair().map(|(k, v)| {
Ok(MegaTuple {
keys: vec![Tuple::new(k).into()],
vals: vec![Tuple::new(v).into()],
})
})
})
}
}
}
@ -428,7 +430,7 @@ impl<'a> Iterator for EdgeIterator<'a> {
self.started = true;
}
loop {
match self.it.pair() {
match unsafe { self.it.pair() } {
None => return None,
Some((k, v)) => {
let vt = Tuple::new(v);
@ -462,7 +464,7 @@ impl<'a> Iterator for EdgeKeyOnlyBwdIterator<'a> {
self.started = true;
}
loop {
match self.it.pair() {
match unsafe { self.it.pair() } {
None => return None,
Some((_k, rev_k)) => {
let rev_k_tuple = Tuple::new(rev_k);

@ -289,7 +289,7 @@ mod tests {
sess.rollback().unwrap();
let it = sess.txn.iterator(true, &sess.perm_cf);
it.to_first();
while let Some((k, v)) = it.pair() {
while let Some((k, v)) = unsafe { it.pair() } {
println!("K: {:?}, V: {:?}", Tuple::new(k), Tuple::new(v));
it.next();
}
@ -339,7 +339,7 @@ mod tests {
let it = sess.txn.iterator(true, &sess.perm_cf);
it.to_first();
while let Some((k, v)) = it.pair() {
while let Some((k, v)) = unsafe { it.pair() } {
println!("K: {:?}, V: {:?}", Tuple::new(k), Tuple::new(v));
it.next();
}

Loading…
Cancel
Save