From: imeevma@tarantool.org To: korablev@tarantool.org Cc: tarantool-patches@dev.tarantool.org Subject: [Tarantool-patches] [PATCH v1 1/1] sql: limit blob size during CAST AS INTEGER Date: Tue, 11 Feb 2020 12:52:57 +0300 [thread overview] Message-ID: <4e5891d426667d49189c3a96fdbce5d315b604c2.1581414644.git.imeevma@gmail.com> (raw) This patch limits the number of decoded bytes during CAST from BLOB to INTEGER according to the specified BLOB size. Closes #4766 --- https://github.com/tarantool/tarantool/issues/4766 https://github.com/tarantool/tarantool/tree/imeevma/gh-4766-fix-blob-size-for-cast src/box/sql/util.c | 13 ++++++++++--- test/sql-tap/cast.test.lua | 32 +++++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/box/sql/util.c b/src/box/sql/util.c index f908e9c..8f70ce6 100644 --- a/src/box/sql/util.c +++ b/src/box/sql/util.c @@ -467,14 +467,21 @@ sql_atoi64(const char *z, int64_t *val, bool *is_neg, int length) if (*z == '-') *is_neg = true; + /* + * BLOB data may not end with '\0'. This leads to an error + * in the strtoll() and strtoull() functions. To fix this, + * let's copy the value for decoding into static memory + * and add '\0' to it. + */ + const char *str_value = tt_cstr(z, length); char *end = NULL; errno = 0; - if (*z == '-') { + if (*str_value == '-') { *is_neg = true; - *val = strtoll(z, &end, 10); + *val = strtoll(str_value, &end, 10); } else { *is_neg = false; - uint64_t u_val = strtoull(z, &end, 10); + uint64_t u_val = strtoull(str_value, &end, 10); *val = u_val; } /* Overflow and underflow errors. */ diff --git a/test/sql-tap/cast.test.lua b/test/sql-tap/cast.test.lua index 9c937a0..a579f24 100755 --- a/test/sql-tap/cast.test.lua +++ b/test/sql-tap/cast.test.lua @@ -1,6 +1,6 @@ #!/usr/bin/env tarantool test = require("sqltester") -test:plan(85) +test:plan(87) --!./tcltestrunner.lua -- 2005 June 25 @@ -905,4 +905,34 @@ test:do_execsql_test( -- </cast-5.1> }) +-- +-- gh-4766: Make sure that a blob as part of a tuple can be cast +-- to NUMBER, INTEGER and UNSIGNED. +-- +test:do_execsql_test( + "cast-6.1", + [[ + CREATE TABLE t (a VARBINARY PRIMARY KEY); + INSERT INTO t VALUES (X'33'), (X'372020202020'); + SELECT a, CAST(a AS NUMBER), CAST(a AS INTEGER), CAST(a AS UNSIGNED) FROM t; + DROP TABLE t; + ]], { + -- <cast-6.1> + '3', 3, 3, 3, '7 ', 7, 7, 7 + -- </cast-6.1> + }) + +test:do_execsql_test( + "cast-6.2", + [[ + CREATE TABLE t (a VARBINARY PRIMARY KEY, i INT); + INSERT INTO t VALUES (X'33', 1); + SELECT a, CAST(a AS NUMBER), CAST(a AS INTEGER), CAST(a AS UNSIGNED) FROM t; + DROP TABLE t; + ]], { + -- <cast-6.2> + '3', 3, 3, 3 + -- </cast-6.2> + }) + test:finish_test() -- 2.7.4
next reply other threads:[~2020-02-11 9:52 UTC|newest] Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-02-11 9:52 imeevma [this message] 2020-02-11 14:50 ` Nikita Pettik
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=4e5891d426667d49189c3a96fdbce5d315b604c2.1581414644.git.imeevma@gmail.com \ --to=imeevma@tarantool.org \ --cc=korablev@tarantool.org \ --cc=tarantool-patches@dev.tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH v1 1/1] sql: limit blob size during CAST AS INTEGER' \ /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