diff --git a/src/sql/engine/expr/ob_expr_substr.cpp b/src/sql/engine/expr/ob_expr_substr.cpp index 96cdf0292..3c8b386fd 100644 --- a/src/sql/engine/expr/ob_expr_substr.cpp +++ b/src/sql/engine/expr/ob_expr_substr.cpp @@ -111,7 +111,7 @@ int ObExprSubstr::calc_result_length(ObExprResType *types_array, mbmaxlen = 1; } if (start_pos > 0 && substr_len > 0) { - if (start_pos + substr_len <= result_len + 1) { + if (start_pos <= INT64_MAX - substr_len && start_pos + substr_len <= result_len + 1) { if (is_oracle_mode) { res_len = substr_len * mbmaxlen; } else { diff --git a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_substr.result b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_substr.result index a0e58be08..70ca736d9 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_substr.result +++ b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_substr.result @@ -173,3 +173,37 @@ select substr(3.14159, 2.1, 2.1) from dual; +---------------------------+ | .1 | +---------------------------+ +select substr(1, 1, 9223372036854775807); ++-----------------------------------+ +| substr(1, 1, 9223372036854775807) | ++-----------------------------------+ +| 1 | ++-----------------------------------+ +select substr(123, 2, 9223372036854775806); ++-------------------------------------+ +| substr(123, 2, 9223372036854775806) | ++-------------------------------------+ +| 23 | ++-------------------------------------+ +drop view if exists v1; +create view v1 as select substr(123, 2, 9223372036854775807); +desc v1; ++-------------------------------------+------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++-------------------------------------+------------+------+-----+---------+-------+ +| substr(123, 2, 9223372036854775807) | varchar(2) | NO | | | | ++-------------------------------------+------------+------+-----+---------+-------+ +select * from v1; ++-------------------------------------+ +| substr(123, 2, 9223372036854775807) | ++-------------------------------------+ +| 23 | ++-------------------------------------+ +drop view v1; +SELECT NULL ORDER BY SUBSTR ( 9223372036854775807 FROM @@ob_query_timeout FOR 9223372036854775807 ); ++------+ +| NULL | ++------+ +| NULL | ++------+ + diff --git a/tools/deploy/mysql_test/test_suite/static_engine/t/expr_substr.test b/tools/deploy/mysql_test/test_suite/static_engine/t/expr_substr.test index 72afb281c..95dbf6040 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/t/expr_substr.test +++ b/tools/deploy/mysql_test/test_suite/static_engine/t/expr_substr.test @@ -47,5 +47,17 @@ select substr(3.14159, 2.9, 2.9) from dual; select substr(3.14159, 2.1, 2.1) from dual; --enable_warnings +# bug: +select substr(1, 1, 9223372036854775807); +select substr(123, 2, 9223372036854775806); +--disable_warnings +drop view if exists v1; +--enable_warnings +create view v1 as select substr(123, 2, 9223372036854775807); +desc v1; +select * from v1; +drop view v1; +SELECT NULL ORDER BY SUBSTR ( 9223372036854775807 FROM @@ob_query_timeout FOR 9223372036854775807 ); + connection syscon; --sleep 2