Commit e61f8974 authored by unknown's avatar unknown

Fix calculation for length of LPAD() and RPAD() reported to

client via mysql_fetch_fields(). (Bug #11311)


mysql-test/r/func_str.result:
  Add new results
mysql-test/t/func_str.test:
  Add new regression test
sql/item_strfunc.cc:
  Fix length reported for LPAD() and RPAD() -- they always truncate to the
  length that is given.
parent de0d584b
...@@ -868,3 +868,18 @@ drop table t1; ...@@ -868,3 +868,18 @@ drop table t1;
select hex(29223372036854775809), hex(-29223372036854775809); select hex(29223372036854775809), hex(-29223372036854775809);
hex(29223372036854775809) hex(-29223372036854775809) hex(29223372036854775809) hex(-29223372036854775809)
FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF
create table t1 (i int);
insert into t1 values (1000000000),(1);
select lpad(i, 7, ' ') as t from t1;
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
def t 253 7 7 Y 128 31 63
t
1000000
1
select rpad(i, 7, ' ') as t from t1;
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
def t 253 7 7 Y 128 31 63
t
1000000
1
drop table t1;
...@@ -611,3 +611,14 @@ drop table t1; ...@@ -611,3 +611,14 @@ drop table t1;
# Bug #9854 hex() and out of range handling # Bug #9854 hex() and out of range handling
# #
select hex(29223372036854775809), hex(-29223372036854775809); select hex(29223372036854775809), hex(-29223372036854775809);
#
# Bug #11311: Incorrect length returned from LPAD() and RPAD()
#
create table t1 (i int);
insert into t1 values (1000000000),(1);
--enable_metadata
select lpad(i, 7, ' ') as t from t1;
select rpad(i, 7, ' ') as t from t1;
--disable_metadata
drop table t1;
...@@ -2042,7 +2042,6 @@ void Item_func_rpad::fix_length_and_dec() ...@@ -2042,7 +2042,6 @@ void Item_func_rpad::fix_length_and_dec()
{ {
ulonglong length= ((ulonglong) args[1]->val_int() * ulonglong length= ((ulonglong) args[1]->val_int() *
collation.collation->mbmaxlen); collation.collation->mbmaxlen);
length= max((ulonglong) args[0]->max_length, length);
if (length >= MAX_BLOB_WIDTH) if (length >= MAX_BLOB_WIDTH)
{ {
length= MAX_BLOB_WIDTH; length= MAX_BLOB_WIDTH;
...@@ -2130,7 +2129,6 @@ void Item_func_lpad::fix_length_and_dec() ...@@ -2130,7 +2129,6 @@ void Item_func_lpad::fix_length_and_dec()
{ {
ulonglong length= ((ulonglong) args[1]->val_int() * ulonglong length= ((ulonglong) args[1]->val_int() *
collation.collation->mbmaxlen); collation.collation->mbmaxlen);
length= max((ulonglong) args[0]->max_length, length);
if (length >= MAX_BLOB_WIDTH) if (length >= MAX_BLOB_WIDTH)
{ {
length= MAX_BLOB_WIDTH; length= MAX_BLOB_WIDTH;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment