bugfix: substr expr get wrong result length

This commit is contained in:
dontknow9179 2024-01-03 02:12:46 +00:00 committed by ob-robot
parent bff45aaa70
commit 918714528b
3 changed files with 47 additions and 1 deletions

View File

@ -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 {

View File

@ -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 |
+------+

View File

@ -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