From: Vladimir Davydov <vdavydov.dev@gmail.com> To: Kirill Shcherbatov <kshcherbatov@tarantool.org> Cc: tarantool-patches@freelists.org Subject: Re: [PATCH v1 1/1] box: fix assert with multikey hybrid index Date: Tue, 21 May 2019 19:49:07 +0300 [thread overview] Message-ID: <20190521164907.axeogtzol4wkbqpk@esperanza> (raw) In-Reply-To: <9d568e120e1daaf5e4df7859911088f446a8e403.1558453156.git.kshcherbatov@tarantool.org> On Tue, May 21, 2019 at 06:39:53PM +0300, Kirill Shcherbatov wrote: > 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 > --- > http://github.com/tarantool/tarantool/tree/kshch/gh-4234-hybrid-multikey-index-parts-assert > https://github.com/tarantool/tarantool/issues/4234 > > src/box/field_map.h | 4 ++-- > test/engine/multikey.result | 27 +++++++++++++++++++++++++++ > test/engine/multikey.test.lua | 10 ++++++++++ > 3 files changed, 39 insertions(+), 2 deletions(-) > > diff --git a/src/box/field_map.h b/src/box/field_map.h > index b0dfeb4e4..2e2eea035 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 && field_map[offset_slot] > 0 && > + (int32_t)field_map[offset_slot] < 0) { if (field_map[offset_slot] > 0 && (int32_t)field_map[offset_slot] < 0) Why not simply if ((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..6c763b2dd 100644 > --- a/test/engine/multikey.result > +++ b/test/engine/multikey.result > @@ -753,3 +753,30 @@ i2:select() > s:drop() > --- > ... > +-- Hybrid multikey index definiton. What's 'hybrid'? Please write a comment that wouldn't raise any questions. > +box.cfg{} This box.cfg{} is pointless. Please remove. > +--- > +... > +s = box.schema.space.create('clients') > +--- > +... > +s:format({{name='name', type='string'}, {name='phone', type='array'}, {name='p', type='string'}}) Format isn't necessary to reproduce the issue. Please strip the test case of anything unnecessary. Also, please double-check that it passes with your fix and fails without it. > +--- > +... > +name_idx = s:create_index('name_idx', {parts = {{'name', 'string'}}}) > +--- > +... > +phone_idx = s:create_index('phone_idx', {parts = {{'phone[*]', 'string'}, {'p', 'string'}}, unique=false}) > +--- > +... > +s:insert({"Genadiy", {"911"}, 'b'}) > +--- > +- ['Genadiy', ['911'], 'b'] > +... > +s:insert({"Jorge", {"911", "89457609234"}, 'a'}) > +--- > +- ['Jorge', ['911', '89457609234'], 'a'] > +... > +s:drop() > +--- > +...
next prev parent reply other threads:[~2019-05-21 16:49 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 [this message] 2019-05-21 16:59 ` [tarantool-patches] " Kirill Shcherbatov 2019-05-21 17:04 ` 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=20190521164907.axeogtzol4wkbqpk@esperanza \ --to=vdavydov.dev@gmail.com \ --cc=kshcherbatov@tarantool.org \ --cc=tarantool-patches@freelists.org \ --subject='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