8000 [C-API] Query arguments with list of strings are not copied when query is parsed · Issue #6614 · realm/realm-core · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
[C-API] Query arguments with list of strings are not copied when query is parsed #6614
Closed
@rorbech

Description

@rorbech

While implementing support for passing lists as query arguments to the RQL IN operator in Realm Kotlin (realm/realm-kotlin#1389) to support something like:

realm.writeBlocking {
    copyToRealm(QuerySample().apply { stringField = "1" }) 
    copyToRealm(QuerySample().apply { stringField = "2" }) 
}
realm.query<QuerySample>("stringField IN $0", listOf("1", "2") ).find().run {
    assertEquals(2, size)
}

The above test fails as the query does not return any objects.

After debugging and verifying that arguments are correctly transferred as part of calling
realm_query_parse I wrote this C-API test:

SECTION("string in list") {
                char foo[] = "foo";
                realm_value_t str = rlm_str_val(foo);
                realm_value_t list_arg[2] = {str, rlm_str_val("bar")};

                write([&]() {
                    CHECK(realm_set_value(obj1.get(), foo_properties["string"], rlm_str_val("foo"), false));
                });

                static const size_t num_args = 1;
                realm_query_arg_t args[num_args] = { realm_query_arg_t{2, true, &list_arg[0]} };
                realm_query_arg_t* arg_list = &args[0];
                auto q_string_in_list = cptr_checked(realm_query_parse(realm, class_foo.key, "string IN $0", num_args, arg_list));
                    
                char* s = foo;
                s[0] = 'a';
                size_t count;

                CHECK(checked(realm_query_count(q_string_in_list.get(), &count)));
                CHECK(1 == count);
}

Seems to be that buffers referenced from realm_value_t.strings referenced from the realm_query_arg_t is not copied into C-API memory space. This is different behavior compared to all other methods in the C-API and I would have expected realm_query_parse to get hold of any data needed to execute the query at a later stage. A similar test for passing a single non-list string argument to realm_query_parse returns the correct result even if the buffer is changed between parsing and executing the actual query.

Kotlin tests for integer and boolean argument lists works. I assume that this is because that the are copied as part of converting realm_value_ts to mixed.

But the similar test with list of links also doesn't work even though they should be fully contained in the realm_value_t, so there might be more to it.

The above test is pushed to https://github.com/realm/realm-core/commits/cr/query-in-string-list

Core version

Core version: ~13.10.1 commit a546bd4

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions

    0