From: imeevma@tarantool.org
To: tarantool-patches@freelists.org, v.shpilevoy@tarantool.org
Subject: [tarantool-patches] [PATCH v1 1/1] box: wrong is_nullable for multiple indexes
Date: Thu, 1 Nov 2018 16:50:39 +0300 [thread overview]
Message-ID: <f8bd154f2cd9242f299cc3cabd7b960dbf1ef882.1541080121.git.imeevma@gmail.com> (raw)
If field isn't defined by space format, than in case of multiple
indexes field option is_nullable was the same as it was for last
index that defines it. This is wrong as it should be 'true' only
if it is 'true' for all indexes that defines it.
Closes #3744.
---
Issue: https://github.com/tarantool/tarantool/issues/3744
Branch: https://github.com/tarantool/tarantool/tree/imeevma/gh-3744-wrong-is_nullable-for-multiple-indexes
src/box/tuple_format.c | 12 ++----------
test/engine/null.result | 24 ++++++++++++++++++++++++
test/engine/null.test.lua | 9 +++++++++
3 files changed, 35 insertions(+), 10 deletions(-)
diff --git a/src/box/tuple_format.c b/src/box/tuple_format.c
index 5f4899d..d4af54c 100644
--- a/src/box/tuple_format.c
+++ b/src/box/tuple_format.c
@@ -38,7 +38,7 @@ static intptr_t recycled_format_ids = FORMAT_ID_NIL;
static uint32_t formats_size = 0, formats_capacity = 0;
static const struct tuple_field tuple_field_default = {
- FIELD_TYPE_ANY, TUPLE_OFFSET_SLOT_NIL, false, false,
+ FIELD_TYPE_ANY, TUPLE_OFFSET_SLOT_NIL, false, true,
};
/**
@@ -81,15 +81,7 @@ tuple_format_create(struct tuple_format *format, struct key_def * const *keys,
assert(part->fieldno < format->field_count);
struct tuple_field *field =
&format->fields[part->fieldno];
- if (part->fieldno >= field_count) {
- field->is_nullable = part->is_nullable;
- } else if (field->is_nullable != part->is_nullable) {
- /*
- * In case of mismatch set the most
- * strict option for is_nullable.
- */
- field->is_nullable = false;
- }
+ field->is_nullable &= part->is_nullable;
/*
* Check that there are no conflicts
diff --git a/test/engine/null.result b/test/engine/null.result
index 48d6784..4ec0142 100644
--- a/test/engine/null.result
+++ b/test/engine/null.result
@@ -1693,3 +1693,27 @@ s:insert{9, 10} -- Success.
s:drop()
---
...
+-- gh-3744: Assertion after improper index creation
+s = box.schema.space.create('test', {engine=engine})
+---
+...
+pk = s:create_index('primary', {parts={1, 'unsigned'}})
+---
+...
+sk1 = s:create_index('sk1', {parts={{2, 'number', is_nullable=false}}})
+---
+...
+s:insert{1, -1, 1}
+---
+- [1, -1, 1]
+...
+sk2 = s:create_index('sk2', {parts={{2, 'number', is_nullable=true}}})
+---
+...
+s:insert{2, nil, 2} --error
+---
+- error: 'Tuple field 2 type does not match one required by operation: expected number'
+...
+s:drop()
+---
+...
diff --git a/test/engine/null.test.lua b/test/engine/null.test.lua
index 5eb0684..ba13adf 100644
--- a/test/engine/null.test.lua
+++ b/test/engine/null.test.lua
@@ -505,3 +505,12 @@ s:insert{5} -- Fail.
s:insert{9, 10} -- Success.
s:drop()
+
+-- gh-3744: Assertion after improper index creation
+s = box.schema.space.create('test', {engine=engine})
+pk = s:create_index('primary', {parts={1, 'unsigned'}})
+sk1 = s:create_index('sk1', {parts={{2, 'number', is_nullable=false}}})
+s:insert{1, -1, 1}
+sk2 = s:create_index('sk2', {parts={{2, 'number', is_nullable=true}}})
+s:insert{2, nil, 2} --error
+s:drop()
--
2.7.4
next reply other threads:[~2018-11-01 13:50 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-01 13:50 imeevma [this message]
2018-11-02 10:29 ` Vladislav Shpilevoy
2018-11-02 16:40 ` 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=f8bd154f2cd9242f299cc3cabd7b960dbf1ef882.1541080121.git.imeevma@gmail.com \
--to=imeevma@tarantool.org \
--cc=tarantool-patches@freelists.org \
--cc=v.shpilevoy@tarantool.org \
--subject='Re: [tarantool-patches] [PATCH v1 1/1] box: wrong is_nullable for multiple indexes' \
/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