* [Tarantool-patches] [PATCH] lua/key_def: fix compare_with_key() part count check
@ 2020-12-14 15:35 Sergey Nikiforov
2020-12-16 22:34 ` Vladislav Shpilevoy
2020-12-17 12:37 ` Alexander Turenko
0 siblings, 2 replies; 7+ messages in thread
From: Sergey Nikiforov @ 2020-12-14 15:35 UTC (permalink / raw)
To: tarantool-patches; +Cc: Vladislav Shpilevoy
Added corresponding test
Fixes: #5307
---
src/box/lua/key_def.c | 9 +++++++
.../gh-5307-key_def-part-count-check.result | 1 +
.../gh-5307-key_def-part-count-check.test.lua | 25 +++++++++++++++++++
3 files changed, 35 insertions(+)
create mode 100644 test/app-tap/gh-5307-key_def-part-count-check.result
create mode 100755 test/app-tap/gh-5307-key_def-part-count-check.test.lua
diff --git a/src/box/lua/key_def.c b/src/box/lua/key_def.c
index a781aeff9..674891a85 100644
--- a/src/box/lua/key_def.c
+++ b/src/box/lua/key_def.c
@@ -362,6 +362,15 @@ lbox_key_def_compare_with_key(struct lua_State *L)
size_t key_len;
const char *key_end, *key = lbox_encode_tuple_on_gc(L, 3, &key_len);
uint32_t part_count = mp_decode_array(&key);
+
+ if (part_count > key_def->part_count) {
+ region_truncate(region, region_svp);
+ tuple_unref(tuple);
+ diag_set(ClientError, ER_KEY_PART_COUNT,
+ key_def->part_count, part_count);
+ return luaT_error(L);
+ }
+
if (key_validate_parts(key_def, key, part_count, true,
&key_end) != 0) {
region_truncate(region, region_svp);
diff --git a/test/app-tap/gh-5307-key_def-part-count-check.result b/test/app-tap/gh-5307-key_def-part-count-check.result
new file mode 100644
index 000000000..d47a905a5
--- /dev/null
+++ b/test/app-tap/gh-5307-key_def-part-count-check.result
@@ -0,0 +1 @@
+Failed (as it should), error message: Invalid key part count (expected [0..1], got 9)
diff --git a/test/app-tap/gh-5307-key_def-part-count-check.test.lua b/test/app-tap/gh-5307-key_def-part-count-check.test.lua
new file mode 100755
index 000000000..8c8f6f34b
--- /dev/null
+++ b/test/app-tap/gh-5307-key_def-part-count-check.test.lua
@@ -0,0 +1,25 @@
+#!/usr/bin/env tarantool
+
+key_def = require('key_def')
+kd = key_def.new({{fieldno = 1, type = 'unsigned'}})
+
+-- Should succeed
+if (kd:compare_with_key({1}, {1}) ~= 0) then
+ print("Error: should be equal")
+end
+
+-- Should succeed
+if (kd:compare_with_key({1}, {2}) >= 0) then
+ print("Error: should be less")
+end
+
+-- Should fail
+ok, err = pcall(function()
+ kd:compare_with_key({1}, {1, 2, 3, 4, 5, 6, 7, 8, 9})
+ end)
+if (ok) then
+ print("Error: it should not have succeeded")
+else
+ print("Failed (as it should), error message: " .. err)
+end
+
--
2.25.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Tarantool-patches] [PATCH] lua/key_def: fix compare_with_key() part count check
2020-12-14 15:35 [Tarantool-patches] [PATCH] lua/key_def: fix compare_with_key() part count check Sergey Nikiforov
@ 2020-12-16 22:34 ` Vladislav Shpilevoy
2020-12-17 11:28 ` Alexander Turenko
2020-12-17 13:27 ` Sergey Nikiforov
2020-12-17 12:37 ` Alexander Turenko
1 sibling, 2 replies; 7+ messages in thread
From: Vladislav Shpilevoy @ 2020-12-16 22:34 UTC (permalink / raw)
To: Sergey Nikiforov, tarantool-patches
Hi!
On 14.12.2020 16:35, Sergey Nikiforov wrote:
> Added corresponding test
>
> Fixes: #5307
> ---
Please, try to follow the guidelines.
https://github.com/tarantool/tarantool/wiki/Code-review-procedure
I don't see the issue and branch links. Also I can't find the
branch in `git branch -a | grep 5307`. Also in the ticket's
webpage I don't see any links to the commit, which github usually
adds automatically. So I suspect you simply didn't push it anywhere.
> diff --git a/src/box/lua/key_def.c b/src/box/lua/key_def.c
> index a781aeff9..674891a85 100644
> --- a/src/box/lua/key_def.c
> +++ b/src/box/lua/key_def.c
> @@ -362,6 +362,15 @@ lbox_key_def_compare_with_key(struct lua_State *L)
> size_t key_len;
> const char *key_end, *key = lbox_encode_tuple_on_gc(L, 3, &key_len);
> uint32_t part_count = mp_decode_array(&key);
> +
> + if (part_count > key_def->part_count) {
> + region_truncate(region, region_svp);
> + tuple_unref(tuple);
> + diag_set(ClientError, ER_KEY_PART_COUNT,
> + key_def->part_count, part_count);
> + return luaT_error(L);
> + }
Why this check and the call below can't be all simply
replaces with box_key_def_validate_key() call?
> +
> if (key_validate_parts(key_def, key, part_count, true,
> &key_end) != 0) {
> region_truncate(region, region_svp);
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Tarantool-patches] [PATCH] lua/key_def: fix compare_with_key() part count check
2020-12-16 22:34 ` Vladislav Shpilevoy
@ 2020-12-17 11:28 ` Alexander Turenko
2020-12-17 13:27 ` Sergey Nikiforov
1 sibling, 0 replies; 7+ messages in thread
From: Alexander Turenko @ 2020-12-17 11:28 UTC (permalink / raw)
To: Vladislav Shpilevoy; +Cc: tarantool-patches
> > diff --git a/src/box/lua/key_def.c b/src/box/lua/key_def.c
> > index a781aeff9..674891a85 100644
> > --- a/src/box/lua/key_def.c
> > +++ b/src/box/lua/key_def.c
> > @@ -362,6 +362,15 @@ lbox_key_def_compare_with_key(struct lua_State *L)
> > size_t key_len;
> > const char *key_end, *key = lbox_encode_tuple_on_gc(L, 3, &key_len);
> > uint32_t part_count = mp_decode_array(&key);
> > +
> > + if (part_count > key_def->part_count) {
> > + region_truncate(region, region_svp);
> > + tuple_unref(tuple);
> > + diag_set(ClientError, ER_KEY_PART_COUNT,
> > + key_def->part_count, part_count);
> > + return luaT_error(L);
> > + }
>
> Why this check and the call below can't be all simply
> replaces with box_key_def_validate_key() call?
I agree.
I introduced this function to use in the corresponding place of the
tuple-keydef code:
https://github.com/tarantool/tuple-keydef/blob/10c00a9aa289bb16446239edfa056ee48b467161/tuple/keydef.c#L517
>
> > +
> > if (key_validate_parts(key_def, key, part_count, true,
> > &key_end) != 0) {
> > region_truncate(region, region_svp);
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Tarantool-patches] [PATCH] lua/key_def: fix compare_with_key() part count check
2020-12-14 15:35 [Tarantool-patches] [PATCH] lua/key_def: fix compare_with_key() part count check Sergey Nikiforov
2020-12-16 22:34 ` Vladislav Shpilevoy
@ 2020-12-17 12:37 ` Alexander Turenko
1 sibling, 0 replies; 7+ messages in thread
From: Alexander Turenko @ 2020-12-17 12:37 UTC (permalink / raw)
To: Sergey Nikiforov; +Cc: tarantool-patches, Vladislav Shpilevoy
> diff --git a/test/app-tap/gh-5307-key_def-part-count-check.result b/test/app-tap/gh-5307-key_def-part-count-check.result
> new file mode 100644
> index 000000000..d47a905a5
> --- /dev/null
> +++ b/test/app-tap/gh-5307-key_def-part-count-check.result
> @@ -0,0 +1 @@
> +Failed (as it should), error message: Invalid key part count (expected [0..1], got 9)
> diff --git a/test/app-tap/gh-5307-key_def-part-count-check.test.lua b/test/app-tap/gh-5307-key_def-part-count-check.test.lua
> new file mode 100755
> index 000000000..8c8f6f34b
> --- /dev/null
> +++ b/test/app-tap/gh-5307-key_def-part-count-check.test.lua
box-tap fit better here, because key_def (C part and the Lua module) is
part of the database implementation ('box').
> @@ -0,0 +1,25 @@
> +#!/usr/bin/env tarantool
> +
> +key_def = require('key_def')
> +kd = key_def.new({{fieldno = 1, type = 'unsigned'}})
`x = 42` is equivalent of `_G.x = 42` if there is no definition of `x`
in the scope.
I would use 'local' for such code hunks. It does not change any
behaviour here, just for the sake of our usual style for Lua modules.
In a module it is undesirable to set a global variable, which accessible
for other modules. At least for a variable that is not intended to be
exported.
> +
> +-- Should succeed
> +if (kd:compare_with_key({1}, {1}) ~= 0) then
> + print("Error: should be equal")
> +end
I would prefer to use 'tap' built-in module ([1]) for such tests. It
produces TAP13 output and does not require a result file. Most of tests
in the '*-tap' test suites procude TAP13 output.
[1]: https://www.tarantool.io/en/doc/latest/reference/reference_lua/tap/
> +
> +-- Should succeed
> +if (kd:compare_with_key({1}, {2}) >= 0) then
> + print("Error: should be less")
> +end
> +
> +-- Should fail
> +ok, err = pcall(function()
> + kd:compare_with_key({1}, {1, 2, 3, 4, 5, 6, 7, 8, 9})
> + end)
The indentation is strange here. I would write it like so:
| local exp_err = '<..expected error message..>'
| local ok, err = pcall(kd.compare_with_key, kd, {1}, {1, 2, 3, 4, 5, 6, 7, 8, 9})
| test:is_deeply({ok, tostring(err)}, {false, exp_err}, '<..short description..>')
tostring() is to convert a box.error object to a string, otherwise
is_deeply() fails to find them equal.
Or, with extra function:
| local exp_err = '<..expected error message..>'
| local ok, err = pcall(function()
| return kd:compare_with_key({1}, {1, 2, 3, 4, 5, 6, 7, 8, 9})
| end)
| test:is_deeply({ok, tostring(err)}, {false, exp_err}, '<..short description..>')
(Personally I prefer to avoid extra wrapping function, when we want to
just call one function under pcall).
> +if (ok) then
> + print("Error: it should not have succeeded")
> +else
> + print("Failed (as it should), error message: " .. err)
> +end
An if condition may be written without parentheses in Lua.
I would explicitly set an exit code:
| os.exit(test:check() and 0 or 1)
This way we have more freedom in automation: say, we can run a subset of
tests without test-run and check their exit code without checks for
output. To be honest, I just find it more intuitive, when a failing test
process set a non-zero exit code.
It would be great to also open a PR to the tuple-keydef module with the
new test. I fixed the corresponding problem in the module, but don't add
any test for it.
https://github.com/tarantool/tuple-keydef/issues/7
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Tarantool-patches] [PATCH] lua/key_def: fix compare_with_key() part count check
2020-12-16 22:34 ` Vladislav Shpilevoy
2020-12-17 11:28 ` Alexander Turenko
@ 2020-12-17 13:27 ` Sergey Nikiforov
2020-12-17 16:41 ` Alexander Turenko
2020-12-20 16:33 ` Vladislav Shpilevoy
1 sibling, 2 replies; 7+ messages in thread
From: Sergey Nikiforov @ 2020-12-17 13:27 UTC (permalink / raw)
To: Vladislav Shpilevoy, tarantool-patches; +Cc: Alexander Turenko
Hi!
On 17.12.2020 1:34, Vladislav Shpilevoy wrote:
> Hi!
>
> On 14.12.2020 16:35, Sergey Nikiforov wrote:
>> Added corresponding test
>>
>> Fixes: #5307
>> ---
>
> Please, try to follow the guidelines.
> https://github.com/tarantool/tarantool/wiki/Code-review-procedure
>
> I don't see the issue and branch links. Also I can't find the
> branch in `git branch -a | grep 5307`. Also in the ticket's
> webpage I don't see any links to the commit, which github usually
> adds automatically. So I suspect you simply didn't push it anywhere.
Of course I did not push my branches for the first batch of patches -
because no one said I had to. I am new to github and Tarantool workflow,
sorry.
>> diff --git a/src/box/lua/key_def.c b/src/box/lua/key_def.c
>> index a781aeff9..674891a85 100644
>> --- a/src/box/lua/key_def.c
>> +++ b/src/box/lua/key_def.c
>> @@ -362,6 +362,15 @@ lbox_key_def_compare_with_key(struct lua_State *L)
>> size_t key_len;
>> const char *key_end, *key = lbox_encode_tuple_on_gc(L, 3, &key_len);
>> uint32_t part_count = mp_decode_array(&key);
>> +
>> + if (part_count > key_def->part_count) {
>> + region_truncate(region, region_svp);
>> + tuple_unref(tuple);
>> + diag_set(ClientError, ER_KEY_PART_COUNT,
>> + key_def->part_count, part_count);
>> + return luaT_error(L);
>> + }
>
> Why this check and the call below can't be all simply
> replaces with box_key_def_validate_key() call?
Because we need part_count later. With box_key_def_validate_key() we
would have to call mp_decode_array() twice or add yet another parameter
to box_key_def_validate_key(). Is that good idea?
>> +
>> if (key_validate_parts(key_def, key, part_count, true,
>> &key_end) != 0) {
>> region_truncate(region, region_svp);
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Tarantool-patches] [PATCH] lua/key_def: fix compare_with_key() part count check
2020-12-17 13:27 ` Sergey Nikiforov
@ 2020-12-17 16:41 ` Alexander Turenko
2020-12-20 16:33 ` Vladislav Shpilevoy
1 sibling, 0 replies; 7+ messages in thread
From: Alexander Turenko @ 2020-12-17 16:41 UTC (permalink / raw)
To: Sergey Nikiforov; +Cc: tarantool-patches, Vladislav Shpilevoy
On Thu, Dec 17, 2020 at 04:27:09PM +0300, Sergey Nikiforov wrote:
> > > diff --git a/src/box/lua/key_def.c b/src/box/lua/key_def.c
> > > index a781aeff9..674891a85 100644
> > > --- a/src/box/lua/key_def.c
> > > +++ b/src/box/lua/key_def.c
> > > @@ -362,6 +362,15 @@ lbox_key_def_compare_with_key(struct lua_State *L)
> > > size_t key_len;
> > > const char *key_end, *key = lbox_encode_tuple_on_gc(L, 3, &key_len);
> > > uint32_t part_count = mp_decode_array(&key);
> > > +
> > > + if (part_count > key_def->part_count) {
> > > + region_truncate(region, region_svp);
> > > + tuple_unref(tuple);
> > > + diag_set(ClientError, ER_KEY_PART_COUNT,
> > > + key_def->part_count, part_count);
> > > + return luaT_error(L);
> > > + }
> >
> > Why this check and the call below can't be all simply
> > replaces with box_key_def_validate_key() call?
>
> Because we need part_count later. With box_key_def_validate_key() we would
> have to call mp_decode_array() twice or add yet another parameter to
> box_key_def_validate_key(). Is that good idea?
We can't change box_key_def_validate_key() parameters, it is in the
public C API.
The code would look more accurate if we'll reuse the public functions
(box_key_def_validate_key() and box_tuple_compare_with_key()) here.
However, right, it'll decode the msgpack array size twice.
I think it is negligible comparing to the validation of the key against
given key_def. If'll need maximum performance from the module, we'll add
an option to skip validation at all.
>
> > > +
> > > if (key_validate_parts(key_def, key, part_count, true,
> > > &key_end) != 0) {
> > > region_truncate(region, region_svp);
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Tarantool-patches] [PATCH] lua/key_def: fix compare_with_key() part count check
2020-12-17 13:27 ` Sergey Nikiforov
2020-12-17 16:41 ` Alexander Turenko
@ 2020-12-20 16:33 ` Vladislav Shpilevoy
1 sibling, 0 replies; 7+ messages in thread
From: Vladislav Shpilevoy @ 2020-12-20 16:33 UTC (permalink / raw)
To: Sergey Nikiforov, tarantool-patches; +Cc: Alexander Turenko
On 17.12.2020 14:27, Sergey Nikiforov via Tarantool-patches wrote:
> Hi!
>
> On 17.12.2020 1:34, Vladislav Shpilevoy wrote:
>> Hi!
>>
>> On 14.12.2020 16:35, Sergey Nikiforov wrote:
>>> Added corresponding test
>>>
>>> Fixes: #5307
>>> ---
>>
>> Please, try to follow the guidelines.
>> https://github.com/tarantool/tarantool/wiki/Code-review-procedure
>>
>> I don't see the issue and branch links. Also I can't find the
>> branch in `git branch -a | grep 5307`. Also in the ticket's
>> webpage I don't see any links to the commit, which github usually
>> adds automatically. So I suspect you simply didn't push it anywhere.
>
> Of course I did not push my branches for the first batch of patches - because no one said I had to. I am new to github and Tarantool workflow, sorry.
Ok, now you know! But where is the branch? I don't see a link,
and `git branch -a | grep 5307` is empty.
>>> diff --git a/src/box/lua/key_def.c b/src/box/lua/key_def.c
>>> index a781aeff9..674891a85 100644
>>> --- a/src/box/lua/key_def.c
>>> +++ b/src/box/lua/key_def.c
>>> @@ -362,6 +362,15 @@ lbox_key_def_compare_with_key(struct lua_State *L)
>>> size_t key_len;
>>> const char *key_end, *key = lbox_encode_tuple_on_gc(L, 3, &key_len);
>>> uint32_t part_count = mp_decode_array(&key);
>>> +
>>> + if (part_count > key_def->part_count) {
>>> + region_truncate(region, region_svp);
>>> + tuple_unref(tuple);
>>> + diag_set(ClientError, ER_KEY_PART_COUNT,
>>> + key_def->part_count, part_count);
>>> + return luaT_error(L);
>>> + }
>>
>> Why this check and the call below can't be all simply
>> replaces with box_key_def_validate_key() call?
>
> Because we need part_count later. With box_key_def_validate_key() we would have to call mp_decode_array() twice or add yet another parameter to box_key_def_validate_key(). Is that good idea?
Ok, then the patch looks fine in the email. I would like
to see it on the branch to check how it works.
You may also try to move region_truncate + tuple_unref to
some common place and do goto to there. These actions are
done 3 times now.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2020-12-20 16:33 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-14 15:35 [Tarantool-patches] [PATCH] lua/key_def: fix compare_with_key() part count check Sergey Nikiforov
2020-12-16 22:34 ` Vladislav Shpilevoy
2020-12-17 11:28 ` Alexander Turenko
2020-12-17 13:27 ` Sergey Nikiforov
2020-12-17 16:41 ` Alexander Turenko
2020-12-20 16:33 ` Vladislav Shpilevoy
2020-12-17 12:37 ` Alexander Turenko
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox