bugfix: substr expr get wrong result length
This commit is contained in:
@ -111,7 +111,7 @@ int ObExprSubstr::calc_result_length(ObExprResType *types_array,
|
|||||||
mbmaxlen = 1;
|
mbmaxlen = 1;
|
||||||
}
|
}
|
||||||
if (start_pos > 0 && substr_len > 0) {
|
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) {
|
if (is_oracle_mode) {
|
||||||
res_len = substr_len * mbmaxlen;
|
res_len = substr_len * mbmaxlen;
|
||||||
} else {
|
} else {
|
||||||
|
@ -173,3 +173,37 @@ select substr(3.14159, 2.1, 2.1) from dual;
|
|||||||
+---------------------------+
|
+---------------------------+
|
||||||
| .1 |
|
| .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 |
|
||||||
|
+------+
|
||||||
|
|
||||||
|
@ -47,5 +47,17 @@ select substr(3.14159, 2.9, 2.9) from dual;
|
|||||||
select substr(3.14159, 2.1, 2.1) from dual;
|
select substr(3.14159, 2.1, 2.1) from dual;
|
||||||
--enable_warnings
|
--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;
|
connection syscon;
|
||||||
--sleep 2
|
--sleep 2
|
||||||
|
Reference in New Issue
Block a user