Skip to content

Commit 688f13c

Browse files
committed
Fix get_unchecked_manual using archetype index instead of table row. (#6625)
# Objective Fix #6623. ## Solution Use the right table row instead of the `EntityLocation` archetype index.
1 parent 342f69e commit 688f13c

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

crates/bevy_ecs/src/lib.rs

+23
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,29 @@ mod tests {
707707
assert!(i32_query.get(&world, a).is_err());
708708
}
709709

710+
#[test]
711+
fn query_get_works_across_sparse_removal() {
712+
// Regression test for: https://github.com/bevyengine/bevy/issues/6623
713+
let mut world = World::new();
714+
let a = world.spawn((TableStored("abc"), SparseStored(123))).id();
715+
let b = world.spawn((TableStored("def"), SparseStored(456))).id();
716+
let c = world
717+
.spawn((TableStored("ghi"), SparseStored(789), B(1)))
718+
.id();
719+
720+
let mut query = world.query::<&TableStored>();
721+
assert_eq!(query.get(&world, a).unwrap(), &TableStored("abc"));
722+
assert_eq!(query.get(&world, b).unwrap(), &TableStored("def"));
723+
assert_eq!(query.get(&world, c).unwrap(), &TableStored("ghi"));
724+
725+
world.entity_mut(b).remove::<SparseStored>();
726+
world.entity_mut(c).remove::<SparseStored>();
727+
728+
assert_eq!(query.get(&world, a).unwrap(), &TableStored("abc"));
729+
assert_eq!(query.get(&world, b).unwrap(), &TableStored("def"));
730+
assert_eq!(query.get(&world, c).unwrap(), &TableStored("ghi"));
731+
}
732+
710733
#[test]
711734
fn remove_tracking() {
712735
let mut world = World::new();

crates/bevy_ecs/src/query/state.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,7 @@ impl<Q: WorldQuery, F: ReadOnlyWorldQuery> QueryState<Q, F> {
418418
let mut fetch = Q::init_fetch(world, &self.fetch_state, last_change_tick, change_tick);
419419
let mut filter = F::init_fetch(world, &self.filter_state, last_change_tick, change_tick);
420420

421+
let table_row = archetype.entity_table_row(location.index);
421422
let table = world
422423
.storages()
423424
.tables
@@ -426,8 +427,8 @@ impl<Q: WorldQuery, F: ReadOnlyWorldQuery> QueryState<Q, F> {
426427
Q::set_archetype(&mut fetch, &self.fetch_state, archetype, table);
427428
F::set_archetype(&mut filter, &self.filter_state, archetype, table);
428429

429-
if F::filter_fetch(&mut filter, entity, location.index) {
430-
Ok(Q::fetch(&mut fetch, entity, location.index))
430+
if F::filter_fetch(&mut filter, entity, table_row) {
431+
Ok(Q::fetch(&mut fetch, entity, table_row))
431432
} else {
432433
Err(QueryEntityError::QueryDoesNotMatch(entity))
433434
}

0 commit comments

Comments
 (0)