diff --git a/changelogs/unreleased/gh-9469-too-big-decimal.md b/changelogs/unreleased/gh-9469-too-big-decimal.md new file mode 100644 index 0000000000000000000000000000000000000000..641e4bde22079d951beed8158429e9e8f377ef8b --- /dev/null +++ b/changelogs/unreleased/gh-9469-too-big-decimal.md @@ -0,0 +1,4 @@ +## bugfix/sql + +* Fixed a crash when a decimal literal representing a decimal number greater + than or equal to 10^38 was parsed in SQL (gh-9469). diff --git a/src/box/errcode.h b/src/box/errcode.h index 7a33db5a07cba9be09ec852431d9f20f982eac9d..ceafd3c308178afaf05b3757b3ca52c11fb8f410 100644 --- a/src/box/errcode.h +++ b/src/box/errcode.h @@ -331,6 +331,7 @@ struct errcode_record { /*276 */_(ER_UNUSED9, "") \ /*277 */_(ER_UNUSED10, "") \ /*278 */_(ER_IN_ANOTHER_PROMOTE, "box.ctl.promote() is already running") \ + /*279 */_(ER_INVALID_DEC, "Invalid decimal: '%s'") \ /* * !IMPORTANT! Please follow instructions at start of the file diff --git a/src/box/sql/expr.c b/src/box/sql/expr.c index 79b2400de9afb27b61d90e430c2f06dad76d7421..95844b76c7490a354b597b2b0aade2049184ca28 100644 --- a/src/box/sql/expr.c +++ b/src/box/sql/expr.c @@ -3152,6 +3152,7 @@ expr_code_dec(struct Parse *parser, struct Expr *expr, bool is_neg, int reg) return; error: sql_xfree(value); + diag_set(ClientError, ER_INVALID_DEC, str); parser->is_aborted = true; } diff --git a/test/box/error.result b/test/box/error.result index e3268ca27b5989010b38dd79d27c9bdfb89b2e7c..a8f80f8275b938c4a39ba5a35b953c87af3a2a1e 100644 --- a/test/box/error.result +++ b/test/box/error.result @@ -487,6 +487,7 @@ t; | 272: box.error.SCHEMA_UPGRADE_IN_PROGRESS | 274: box.error.UNCONFIGURED | 278: box.error.IN_ANOTHER_PROMOTE + | 279: box.error.INVALID_DEC | ... test_run:cmd("setopt delimiter ''"); diff --git a/test/sql-luatest/gh_9469_too_big_decimals_test.lua b/test/sql-luatest/gh_9469_too_big_decimals_test.lua new file mode 100644 index 0000000000000000000000000000000000000000..285609675ed1781b77b9fb831f70640f3e63acc6 --- /dev/null +++ b/test/sql-luatest/gh_9469_too_big_decimals_test.lua @@ -0,0 +1,29 @@ +local server = require('luatest.server') +local t = require('luatest') + +local g = t.group() + +g.before_all(function() + g.server = server:new({alias = 'master'}) + g.server:start() +end) + +g.after_all(function() + g.server:stop() +end) + +g.test_too_big_decimal = function() + g.server:exec(function() + local dec = '111111111111111111111111111111111111111.0' + local sql = ([[SELECT %s;]]):format(dec) + local exp = ([[Invalid decimal: '%s']]):format(dec) + local res, err = box.execute(sql) + t.assert(res == nil) + t.assert_equals(err.message, exp) + + sql = ([[SELECT -%s;]]):format(dec) + res, err = box.execute(sql) + t.assert(res == nil) + t.assert_equals(err.message, exp) + end) +end