From: Kirill Shcherbatov <kshcherbatov@tarantool.org> To: tarantool-patches@freelists.org, Vladimir Davydov <vdavydov.dev@gmail.com> Subject: Re: [tarantool-patches] Re: [PATCH v1 1/1] box: fix assert with multikey hybrid index Date: Tue, 21 May 2019 19:59:37 +0300 [thread overview] Message-ID: <e5edb1d3-5c6e-9dbc-7599-2240247ebd91@tarantool.org> (raw) In-Reply-To: <20190521164907.axeogtzol4wkbqpk@esperanza> Thank you for your feedback! Done. ==================================================== Tarantool used to assume that offset_slot has an extension iff field_map_get_offset is called with multikey_idx >= 0. In fact, when some part of the index contains a multikey index placeholder, tuple_compare_* routines pass a tuple_hint in meaning of multikey index for each tuple_field_raw_by_part call, even for regular key_part that doesn't have array index placeholder (and, correspondingly, field_map extension). Thus this assumption is invalid. This patch uses the fact that field_map slots that have extensoin store negative offset to distinguish multikey and normal usage of the field_map_get_offset routine. Closes #4234 --- src/box/field_map.h | 4 ++-- test/engine/multikey.result | 24 ++++++++++++++++++++++++ test/engine/multikey.test.lua | 11 +++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/box/field_map.h b/src/box/field_map.h index b0dfeb4e4..a1a5a9dba 100644 --- a/src/box/field_map.h +++ b/src/box/field_map.h @@ -152,8 +152,8 @@ field_map_get_offset(const uint32_t *field_map, int32_t offset_slot, int multikey_idx) { uint32_t offset; - if (multikey_idx != MULTIKEY_NONE && field_map[offset_slot] > 0) { - assert((int32_t)field_map[offset_slot] < 0); + if (multikey_idx != MULTIKEY_NONE && + (int32_t) field_map[offset_slot] < 0) { /** * The field_map extent has the following * structure: [size=N|slot1|slot2|..|slotN] diff --git a/test/engine/multikey.result b/test/engine/multikey.result index 1d5d9e200..7301081fe 100644 --- a/test/engine/multikey.result +++ b/test/engine/multikey.result @@ -753,3 +753,27 @@ i2:select() s:drop() --- ... +-- +-- gh-4234: Assert when using indexes containing both multikey +-- and regular key_parts. +-- +s = box.schema.space.create('clients') +--- +... +name_idx = s:create_index('name_idx', {parts = {{1, 'string'}}}) +--- +... +phone_idx = s:create_index('phone_idx', {parts = {{'[2][*]', 'string'}, {3, 'string'}}, unique=false}) +--- +... +s:insert({"Genadiy", {"911"}, 'b'}) +--- +- ['Genadiy', ['911'], 'b'] +... +s:insert({"Jorge", {"911", "89457609234"}, 'a'}) +--- +- ['Jorge', ['911', '89457609234'], 'a'] +... +s:drop() +--- +... diff --git a/test/engine/multikey.test.lua b/test/engine/multikey.test.lua index f32f49d2b..f2392b840 100644 --- a/test/engine/multikey.test.lua +++ b/test/engine/multikey.test.lua @@ -194,3 +194,14 @@ s:replace{2, {{2, 3}}} i2 = s:create_index('sk', {parts = {{2, 'unsigned', path = '[1][*]'}}}) i2:select() s:drop() + +-- +-- gh-4234: Assert when using indexes containing both multikey +-- and regular key_parts. +-- +s = box.schema.space.create('clients') +name_idx = s:create_index('name_idx', {parts = {{1, 'string'}}}) +phone_idx = s:create_index('phone_idx', {parts = {{'[2][*]', 'string'}, {3, 'string'}}, unique=false}) +s:insert({"Genadiy", {"911"}, 'b'}) +s:insert({"Jorge", {"911", "89457609234"}, 'a'}) +s:drop() -- 2.21.0
next prev parent reply other threads:[~2019-05-21 16:59 UTC|newest] Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-05-21 15:39 Kirill Shcherbatov 2019-05-21 16:49 ` Vladimir Davydov 2019-05-21 16:59 ` Kirill Shcherbatov [this message] 2019-05-21 17:04 ` [tarantool-patches] " Vladislav Shpilevoy 2019-05-22 10:21 ` Vladimir Davydov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=e5edb1d3-5c6e-9dbc-7599-2240247ebd91@tarantool.org \ --to=kshcherbatov@tarantool.org \ --cc=tarantool-patches@freelists.org \ --cc=vdavydov.dev@gmail.com \ --subject='Re: [tarantool-patches] Re: [PATCH v1 1/1] box: fix assert with multikey hybrid index' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox