mirror of
https://github.com/MariaDB/server.git
synced 2025-08-05 13:16:09 +03:00
MDEV-30879 Add support for up to BASE 62 to CONV()
BASE 62 uses 0-9, A-Z and then a-z to give the numbers 0-61. This patch increases the range of the string functions to cover this. Based on ideas and tests in PR #2589, but re-written into the charset functions. Includes fix by Sergei, UBSAN complained: ctype-simple.c:683:38: runtime error: negation of -9223372036854775808 cannot be represented in type 'long long int'; cast to an unsigned type to negate this value to itself Co-authored-by: Weijun Huang <huangweijun1001@gmail.com> Co-authored-by: Sergei Golubchik <serg@mariadb.org>
This commit is contained in:
committed by
Andrew Hutchings
parent
be6d48fd53
commit
f552febe43
@@ -31,6 +31,8 @@
|
||||
/*
|
||||
_dig_vec arrays are public because they are used in several outer places.
|
||||
*/
|
||||
const char _dig_vec_base62[] =
|
||||
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
||||
const char _dig_vec_upper[] =
|
||||
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
const char _dig_vec_lower[] =
|
||||
@@ -50,7 +52,7 @@ const char _dig_vec_lower[] =
|
||||
DESCRIPTION
|
||||
Converts the (long) integer value to its character form and moves it to
|
||||
the destination buffer followed by a terminating NUL.
|
||||
If radix is -2..-36, val is taken to be SIGNED, if radix is 2..36, val is
|
||||
If radix is -2..-62, val is taken to be SIGNED, if radix is 2..62, val is
|
||||
taken to be UNSIGNED. That is, val is signed if and only if radix is.
|
||||
All other radixes treated as bad and nothing will be changed in this case.
|
||||
|
||||
@@ -68,12 +70,17 @@ int2str(register long int val, register char *dst, register int radix,
|
||||
char buffer[65];
|
||||
register char *p;
|
||||
long int new_val;
|
||||
const char *dig_vec= upcase ? _dig_vec_upper : _dig_vec_lower;
|
||||
const char *dig_vec;
|
||||
ulong uval= (ulong) val;
|
||||
|
||||
if (radix < -36 || radix > 36)
|
||||
dig_vec= _dig_vec_base62;
|
||||
else
|
||||
dig_vec= upcase ? _dig_vec_upper : _dig_vec_lower;
|
||||
|
||||
if (radix < 0)
|
||||
{
|
||||
if (radix < -36 || radix > -2)
|
||||
if (radix < -62 || radix > -2)
|
||||
return NullS;
|
||||
if (val < 0)
|
||||
{
|
||||
@@ -83,7 +90,7 @@ int2str(register long int val, register char *dst, register int radix,
|
||||
}
|
||||
radix = -radix;
|
||||
}
|
||||
else if (radix > 36 || radix < 2)
|
||||
else if (radix > 62 || radix < 2)
|
||||
return NullS;
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user