1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

MDEV-29552 LEFT and RIGHT with big value for parameter 'len' >0 return empty value in view

The code in max_length_for_string() erroneously returned 0
for huge numbers like 4294967295.

Rewriting the code in a more straightforward way.
This commit is contained in:
Alexander Barkov
2024-11-05 09:19:05 +04:00
parent b07258a0d5
commit c2bf1d4781
3 changed files with 35 additions and 2 deletions

View File

@@ -5332,3 +5332,17 @@ DO OCT(-9223372036854775808);
#
# End of 10.5 tests
#
#
# Start of 10.6 tests
#
#
# MDEV-29552 LEFT and RIGHT with big value for parameter 'len' >0 return empty value in view
#
create view v1 as select left('hello', 4294967295);
select * from v1;
left('hello', 4294967295)
hello
drop view v1;
#
# End of 10.6 tests
#

View File

@@ -2380,3 +2380,19 @@ DO OCT(-9223372036854775808);
--echo #
--echo # End of 10.5 tests
--echo #
--echo #
--echo # Start of 10.6 tests
--echo #
--echo #
--echo # MDEV-29552 LEFT and RIGHT with big value for parameter 'len' >0 return empty value in view
--echo #
create view v1 as select left('hello', 4294967295);
select * from v1;
drop view v1;
--echo #
--echo # End of 10.6 tests
--echo #

View File

@@ -64,11 +64,14 @@ size_t username_char_length= USERNAME_CHAR_LENGTH;
static uint32 max_length_for_string(Item *item)
{
ulonglong length= item->val_int();
/* Note that if value is NULL, val_int() returned 0 */
if (item->null_value)
return 0;
if (length > (ulonglong) LONGLONG_MAX && !item->unsigned_flag)
return 0; // Negative
if (length > (ulonglong) INT_MAX32)
{
/* Limit string length to maxium string length in MariaDB (2G) */
length= item->unsigned_flag ? (ulonglong) INT_MAX32 : 0;
length= (ulonglong) INT_MAX32;
}
return (uint32) length;
}