Skip to content

Commit

Permalink
Fix incorrect serialization of serialized pair ids, bug in query crea…
Browse files Browse the repository at this point in the history
…tion with recycled relationship id
  • Loading branch information
SanderMertens committed May 10, 2023
1 parent 4ec5292 commit 27c87cf
Show file tree
Hide file tree
Showing 9 changed files with 83 additions and 12 deletions.
8 changes: 4 additions & 4 deletions flecs.c
Original file line number Diff line number Diff line change
Expand Up @@ -31975,8 +31975,8 @@ void flecs_json_id(
ecs_strbuf_appendch(buf, '[');

if (ECS_IS_PAIR(id)) {
ecs_entity_t first = ECS_PAIR_FIRST(id);
ecs_entity_t second = ECS_PAIR_SECOND(id);
ecs_entity_t first = ecs_pair_first(world, id);
ecs_entity_t second = ecs_pair_second(world, id);
ecs_strbuf_appendch(buf, '"');
ecs_get_path_w_sep_buf(world, 0, first, ".", "", buf);
ecs_strbuf_appendch(buf, '"');
Expand Down Expand Up @@ -48363,7 +48363,7 @@ int flecs_term_populate_from_id(

ecs_entity_t term_first = flecs_term_id_get_entity(&term->first);
if (term_first) {
if (term_first != first) {
if ((uint32_t)term_first != first) {
flecs_filter_error(ctx, "mismatch between term.id and term.first");
return -1;
}
Expand All @@ -48375,7 +48375,7 @@ int flecs_term_populate_from_id(

ecs_entity_t term_second = flecs_term_id_get_entity(&term->second);
if (term_second) {
if (ecs_entity_t_lo(term_second) != second) {
if ((uint32_t)term_second != second) {
flecs_filter_error(ctx, "mismatch between term.id and term.second");
return -1;
}
Expand Down
4 changes: 2 additions & 2 deletions src/addons/json/json.c
Original file line number Diff line number Diff line change
Expand Up @@ -411,8 +411,8 @@ void flecs_json_id(
ecs_strbuf_appendch(buf, '[');

if (ECS_IS_PAIR(id)) {
ecs_entity_t first = ECS_PAIR_FIRST(id);
ecs_entity_t second = ECS_PAIR_SECOND(id);
ecs_entity_t first = ecs_pair_first(world, id);
ecs_entity_t second = ecs_pair_second(world, id);
ecs_strbuf_appendch(buf, '"');
ecs_get_path_w_sep_buf(world, 0, first, ".", "", buf);
ecs_strbuf_appendch(buf, '"');
Expand Down
4 changes: 2 additions & 2 deletions src/filter.c
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,7 @@ int flecs_term_populate_from_id(

ecs_entity_t term_first = flecs_term_id_get_entity(&term->first);
if (term_first) {
if (term_first != first) {
if ((uint32_t)term_first != first) {
flecs_filter_error(ctx, "mismatch between term.id and term.first");
return -1;
}
Expand All @@ -398,7 +398,7 @@ int flecs_term_populate_from_id(

ecs_entity_t term_second = flecs_term_id_get_entity(&term->second);
if (term_second) {
if (ecs_entity_t_lo(term_second) != second) {
if ((uint32_t)term_second != second) {
flecs_filter_error(ctx, "mismatch between term.id and term.second");
return -1;
}
Expand Down
3 changes: 2 additions & 1 deletion test/api/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -1607,7 +1607,8 @@
"query_next_table_w_populate_last_changed",
"query_next_table_w_populate_skip_first",
"query_next_table_w_populate_skip_last",
"create_query_existing_query_entity"
"create_query_existing_query_entity",
"query_for_recycled_pair"
]
}, {
"id": "Iter",
Expand Down
30 changes: 30 additions & 0 deletions test/api/src/Query.c
Original file line number Diff line number Diff line change
Expand Up @@ -8469,3 +8469,33 @@ void Query_create_query_existing_query_entity() {

ecs_fini(world);
}

void Query_query_for_recycled_pair() {
ecs_world_t *world = ecs_init();

ecs_entity_t rel = ecs_new_entity(world, "Rel");
ecs_entity_t tgt = ecs_new_entity(world, "Tgt");
ecs_delete(world, rel);
ecs_delete(world, tgt);
rel = ecs_new_entity(world, "Rel");
tgt = ecs_new_entity(world, "Tgt");

ecs_entity_t e = ecs_new_w_pair(world, rel, tgt);

ecs_query_t *q = ecs_query(world, {
.filter.terms[0] = {
.first.id = rel,
.second.id = tgt
}
});
test_assert(q != NULL);

ecs_iter_t it = ecs_query_iter(world, q);
test_bool(true, ecs_query_next(&it));
test_int(it.count, 1);
test_uint(it.entities[0], e);
test_uint(ecs_field_id(&it, 1), ecs_pair(rel, tgt));
test_bool(false, ecs_query_next(&it));

ecs_fini(world);
}
7 changes: 6 additions & 1 deletion test/api/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1545,6 +1545,7 @@ void Query_query_next_table_w_populate_last_changed(void);
void Query_query_next_table_w_populate_skip_first(void);
void Query_query_next_table_w_populate_skip_last(void);
void Query_create_query_existing_query_entity(void);
void Query_query_for_recycled_pair(void);

// Testsuite 'Iter'
void Iter_page_iter_0_0(void);
Expand Down Expand Up @@ -8513,6 +8514,10 @@ bake_test_case Query_testcases[] = {
{
"create_query_existing_query_entity",
Query_create_query_existing_query_entity
},
{
"query_for_recycled_pair",
Query_query_for_recycled_pair
}
};

Expand Down Expand Up @@ -12576,7 +12581,7 @@ static bake_test_suite suites[] = {
"Query",
NULL,
NULL,
206,
207,
Query_testcases
},
{
Expand Down
1 change: 1 addition & 0 deletions test/meta/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -734,6 +734,7 @@
"serialize_iterator_variable_ids",
"serialize_iterator_variable_ids_2_entities",
"serialize_iterator_invalid_value",
"serialize_iterator_recycled_pair_id",
"serialize_paged_iterator",
"serialize_paged_iterator_w_optional_component",
"serialize_paged_iterator_w_optional_tag",
Expand Down
31 changes: 30 additions & 1 deletion test/meta/src/SerializeToJson.c
Original file line number Diff line number Diff line change
Expand Up @@ -4070,6 +4070,36 @@ void SerializeToJson_serialize_iterator_invalid_value() {
ecs_fini(world);
}

void SerializeToJson_serialize_iterator_recycled_pair_id() {
ecs_world_t *world = ecs_init();

ecs_entity_t rel = ecs_new_entity(world, "Rel");
ecs_entity_t tgt = ecs_new_entity(world, "Tgt");
ecs_delete(world, tgt);
tgt = ecs_new_entity(world, "Tgt");

ecs_entity_t e = ecs_new_w_pair(world, rel, tgt);
ecs_set_name(world, e, "ent");

ecs_query_t *q = ecs_query(world, {
.filter.terms[0] = {
.first.id = rel,
.second.id = tgt
}
});

ecs_iter_t it = ecs_query_iter(world, q);
char *json = ecs_iter_to_json(world, &it, NULL);
test_assert(json != NULL);
test_str(json, "{\"ids\":[[\"Rel\",\"Tgt\"]], \"results\":["
"{\"ids\":[[\"Rel\",\"Tgt\"]], \"sources\":[0], \"entities\":[\"ent\"]}"
"]}");

ecs_os_free(json);

ecs_fini(world);
}

void SerializeToJson_serialize_paged_iterator() {
ecs_world_t *world = ecs_init();

Expand Down Expand Up @@ -4488,4 +4518,3 @@ void SerializeToJson_serialize_anonymous_entities_w_offset() {

ecs_fini(world);
}

7 changes: 6 additions & 1 deletion test/meta/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -703,6 +703,7 @@ void SerializeToJson_serialize_iterator_ids_2_entities(void);
void SerializeToJson_serialize_iterator_variable_ids(void);
void SerializeToJson_serialize_iterator_variable_ids_2_entities(void);
void SerializeToJson_serialize_iterator_invalid_value(void);
void SerializeToJson_serialize_iterator_recycled_pair_id(void);
void SerializeToJson_serialize_paged_iterator(void);
void SerializeToJson_serialize_paged_iterator_w_optional_component(void);
void SerializeToJson_serialize_paged_iterator_w_optional_tag(void);
Expand Down Expand Up @@ -3609,6 +3610,10 @@ bake_test_case SerializeToJson_testcases[] = {
"serialize_iterator_invalid_value",
SerializeToJson_serialize_iterator_invalid_value
},
{
"serialize_iterator_recycled_pair_id",
SerializeToJson_serialize_iterator_recycled_pair_id
},
{
"serialize_paged_iterator",
SerializeToJson_serialize_paged_iterator
Expand Down Expand Up @@ -4454,7 +4459,7 @@ static bake_test_suite suites[] = {
"SerializeToJson",
NULL,
NULL,
129,
130,
SerializeToJson_testcases
},
{
Expand Down

0 comments on commit 27c87cf

Please sign in to comment.