From 676403ecdacc37f1bf2434a2ab471f570e093a2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Edelbo?= Date: Fri, 9 Apr 2021 09:25:16 +0200 Subject: [PATCH] Update after review --- src/realm/query.cpp | 6 ++++-- src/realm/query_engine.cpp | 13 +++---------- test/test_query2.cpp | 13 +++++++++++++ 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/realm/query.cpp b/src/realm/query.cpp index 33acb9f6d8c..d2436ae4ba1 100644 --- a/src/realm/query.cpp +++ b/src/realm/query.cpp @@ -416,9 +416,11 @@ std::unique_ptr make_condition_node(const Table& table, ColKey colum else if (value.is_type(type_TypedLink)) { ObjLink link = value.get_link(); auto target_table = table.get_link_target(column_key); - if (target_table->get_key() == link.get_table_key()) { - key = link.get_obj_key(); + if (target_table->get_key() != link.get_table_key()) { + // This will never match + return std::unique_ptr{new ExpressionNode(std::make_unique())}; } + key = link.get_obj_key(); } return std::unique_ptr{new LinksToNode(column_key, key)}; } diff --git a/src/realm/query_engine.cpp b/src/realm/query_engine.cpp index ddabde7459b..864d2e27d24 100644 --- a/src/realm/query_engine.cpp +++ b/src/realm/query_engine.cpp @@ -711,12 +711,9 @@ size_t LinksToNode::find_first_local(size_t start, size_t end) } else if (m_column_type == col_type_Link) { for (auto& key : m_target_keys) { - if (key) { - // LinkColumn stores link to row N as the integer N + 1 - auto pos = static_cast(m_leaf_ptr)->find_first(key, start, end); - if (pos != realm::npos) { - return pos; - } + auto pos = static_cast(m_leaf_ptr)->find_first(key, start, end); + if (pos != realm::npos) { + return pos; } } } @@ -732,10 +729,6 @@ size_t LinksToNode::find_first_local(size_t start, size_t end) ObjKey key = m_target_keys[0]; if (m_column_type == col_type_LinkList || m_condition_column_key.is_set()) { - if (!key) { - // Null key is never found in link lists - return start; - } BPlusTree links(m_table.unchecked_ptr()->get_alloc()); for (size_t i = start; i < end; i++) { if (ref_type ref = static_cast(m_leaf_ptr)->get(i)) { diff --git a/test/test_query2.cpp b/test/test_query2.cpp index a413aa66461..ed3aa7270b9 100644 --- a/test/test_query2.cpp +++ b/test/test_query2.cpp @@ -5216,10 +5216,16 @@ TEST(Query_LinksTo) q = source->column(col_link).is_null(); tv = q.find_all(); CHECK_EQUAL(tv.size(), 6); + q = source->where().equal(col_link, Mixed()); // Null + tv = q.find_all(); + CHECK_EQUAL(tv.size(), 6); q = source->column(col_link) != null(); found_key = q.find(); CHECK_EQUAL(found_key, source_keys[2]); + q = source->where().not_equal(col_link, Mixed()); // Null + tv = q.find_all(); + CHECK_EQUAL(tv.size(), 4); auto linklist = source->get_object(source_keys[1]).get_linklist_ptr(col_linklist); linklist->add(target_keys[6]); @@ -5246,6 +5252,13 @@ TEST(Query_LinksTo) q = source->where().not_equal(col_linklist, Mixed(target_keys[6])); tv = q.find_all(); CHECK_EQUAL(tv.size(), 2); + + q = source->where().equal(col_linklist, Mixed()); + tv = q.find_all(); + CHECK_EQUAL(tv.size(), 0); // LinkList never matches null + q = source->where().not_equal(col_linklist, Mixed()); + tv = q.find_all(); + CHECK_EQUAL(tv.size(), 3); } TEST(Query_Group_bug)