From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org>
To: Roman Khabibov <roman.habibov@tarantool.org>,
tarantool-patches@freelists.org,
Nikita Pettik <korablev@tarantool.org>
Subject: [tarantool-patches] Re: [PATCH] sql: fix bug with BLOB TRIM() when X'00' in char set
Date: Thu, 20 Dec 2018 23:41:49 +0300 [thread overview]
Message-ID: <fdf69660-503a-ecc2-1116-bc6dd626cea0@tarantool.org> (raw)
In-Reply-To: <20181215105741.28464-1-roman.habibov@tarantool.org>
Nikita, please, do first review.
On 15/12/2018 13:57, Roman Khabibov wrote:
> The reason for the bug was that X'00' is a terminal symbol. If the char set
> contained X'00', all other characters after its (inculding itself) are then
> ignored.
>
> Closes #3543
>
> Branch: https://github.com/tarantool/tarantool/tree/romankhabibov/gh-3543-trim-terminal
> Issue: https://github.com/tarantool/tarantool/issues/3543
> ---
> src/box/sql/func.c | 18 +++++-
> test/sql-tap/func.test.lua | 126 ++++++++++++++++++++++++++++++++++++-
> 2 files changed, 140 insertions(+), 4 deletions(-)
>
> diff --git a/src/box/sql/func.c b/src/box/sql/func.c
> index 9667aead5..5beba7bd2 100644
> --- a/src/box/sql/func.c
> +++ b/src/box/sql/func.c
> @@ -1224,8 +1224,16 @@ trimFunc(sqlite3_context * context, int argc, sqlite3_value ** argv)
> return;
> } else {
> const unsigned char *z;
> - for (z = zCharSet, nChar = 0; *z; nChar++) {
> + int sizeInChar = sqlite3_value_bytes(argv[1]);
> + int length = 0;
> + z = zCharSet;
> + nChar = 0;
> + const unsigned char *zStepBack;
> + while(sizeInChar - length) {
> + zStepBack = z;
> SQLITE_SKIP_UTF8(z);
> + length += z - zStepBack;
> + nChar++;
> }
> if (nChar > 0) {
> azChar =
> @@ -1235,10 +1243,16 @@ trimFunc(sqlite3_context * context, int argc, sqlite3_value ** argv)
> return;
> }
> aLen = (unsigned char *)&azChar[nChar];
> - for (z = zCharSet, nChar = 0; *z; nChar++) {
> + z = zCharSet;
> + nChar = 0;
> + length = 0;
> + while(sizeInChar - length) {
> azChar[nChar] = (unsigned char *)z;
> + zStepBack = z;
> SQLITE_SKIP_UTF8(z);
> + length += z - zStepBack;
> aLen[nChar] = (u8) (z - azChar[nChar]);
> + nChar++;
> }
> }
> }
> diff --git a/test/sql-tap/func.test.lua b/test/sql-tap/func.test.lua
> index 393212968..b7b8e7c4c 100755
> --- a/test/sql-tap/func.test.lua
> +++ b/test/sql-tap/func.test.lua
> @@ -1,6 +1,6 @@
> #!/usr/bin/env tarantool
> test = require("sqltester")
> -test:plan(14535)
> +test:plan(14547)
>
> --!./tcltestrunner.lua
> -- 2001 September 15
> @@ -2100,11 +2100,133 @@ test:do_execsql_test(
> -- </func-22.22>
> })
>
> +-- gh-3543 Check trimming of binary string when X'00' in trimming char set.
> +
> +test:do_execsql_test(
> + "func-22.23",
> + [[
> + SELECT TRIM(X'004100', X'00');
> + ]], {
> + -- <func-22.23>
> + "A"
> + -- </func-22.23>
> + })
> +
> +test:do_execsql_test(
> + "func-22.24",
> + [[
> + SELECT TRIM(X'004100', X'0000');
> + ]], {
> + -- <func-22.24>
> + "A"
> + -- </func-22.24>
> + })
> +
> +test:do_execsql_test(
> + "func-22.25",
> + [[
> + SELECT TRIM(X'004100', X'0042');
> + ]], {
> + -- <func-22.25>
> + "A"
> + -- </func-22.25>
> + })
> +
> +test:do_execsql_test(
> + "func-22.26",
> + [[
> + SELECT TRIM(X'00004100420000', X'00');
> + ]], {
> + -- <func-22.26>
> + "A\0B"
> + -- </func-22.26>
> + })
> +
> +test:do_execsql_test(
> + "func-22.27",
> + [[
> + SELECT LTRIM(X'004100', X'00');
> + ]], {
> + -- <func-22.27>
> + "A\0"
> + -- </func-22.27>
> + })
> +
> +test:do_execsql_test(
> + "func-22.28",
> + [[
> + SELECT LTRIM(X'004100', X'0000');
> + ]], {
> + -- <func-22.28>
> + "A\0"
> + -- </func-22.28>
> + })
> +
> +test:do_execsql_test(
> + "func-22.29",
> + [[
> + SELECT LTRIM(X'004100', X'0042');
> + ]], {
> + -- <func-22.29>
> + "A\0"
> + -- </func-22.29>
> + })
> +
> +test:do_execsql_test(
> + "func-22.30",
> + [[
> + SELECT LTRIM(X'00004100420000', X'00');
> + ]], {
> + -- <func-22.30>
> + "A\0B\0\0"
> + -- </func-22.30>
> + })
> +
> +test:do_execsql_test(
> + "func-22.31",
> + [[
> + SELECT RTRIM(X'004100', X'00');
> + ]], {
> + -- <func-22.31>
> + "\0A"
> + -- </func-22.31>
> + })
> +
> +test:do_execsql_test(
> + "func-22.32",
> + [[
> + SELECT RTRIM(X'004100', X'0000');
> + ]], {
> + -- <func-22.32>
> + "\0A"
> + -- </func-22.32>
> + })
> +
> +test:do_execsql_test(
> + "func-22.33",
> + [[
> + SELECT RTRIM(X'004100', X'0042');
> + ]], {
> + -- <func-22.33>
> + "\0A"
> + -- </func-22.33>
> + })
> +
> +test:do_execsql_test(
> + "func-22.34",
> + [[
> + SELECT RTRIM(X'00004100420000', X'00');
> + ]], {
> + -- <func-22.34>
> + "\0\0A\0B"
> + -- </func-22.34>
> + })
> +
> -- This is to test the deprecated sqlite3_aggregate_count() API.
> --
> --test:do_test(
> -- "func-23.1",
> --- function()
> +-- function()S
> -- sqlite3_create_aggregate("db")
> -- return test:execsql([[
> -- SELECT legacy_count() FROM t6;
>
next prev parent reply other threads:[~2018-12-20 20:41 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-15 10:57 [tarantool-patches] " Roman Khabibov
2018-12-18 8:40 ` [tarantool-patches] " n.pettik
2018-12-18 14:30 ` Roman
2018-12-25 11:40 ` n.pettik
2018-12-26 13:56 ` Roman
2018-12-28 11:09 ` n.pettik
2018-12-20 20:41 ` Vladislav Shpilevoy [this message]
2018-12-27 12:28 ` Kirill Yukhin
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=fdf69660-503a-ecc2-1116-bc6dd626cea0@tarantool.org \
--to=v.shpilevoy@tarantool.org \
--cc=korablev@tarantool.org \
--cc=roman.habibov@tarantool.org \
--cc=tarantool-patches@freelists.org \
--subject='[tarantool-patches] Re: [PATCH] sql: fix bug with BLOB TRIM() when X'\''00'\'' in char set' \
/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