Commit 657a5346 authored by unknown's avatar unknown
Browse files

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 bf45b6ba
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -868,3 +868,18 @@ drop table t1;
select hex(29223372036854775809), hex(-29223372036854775809);
hex(29223372036854775809)	hex(-29223372036854775809)
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;
+11 −0
Original line number Diff line number Diff line
@@ -611,3 +611,14 @@ drop table t1;
# Bug #9854  hex() and out of range handling
#
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;
+0 −2
Original line number Diff line number Diff line
@@ -2042,7 +2042,6 @@ void Item_func_rpad::fix_length_and_dec()
  {
    ulonglong length= ((ulonglong) args[1]->val_int() *
                       collation.collation->mbmaxlen);
    length= max((ulonglong) args[0]->max_length, length);
    if (length >= MAX_BLOB_WIDTH)
    {
      length= MAX_BLOB_WIDTH;
@@ -2130,7 +2129,6 @@ void Item_func_lpad::fix_length_and_dec()
  {
    ulonglong length= ((ulonglong) args[1]->val_int() *
                       collation.collation->mbmaxlen);
    length= max((ulonglong) args[0]->max_length, length);
    if (length >= MAX_BLOB_WIDTH)
    {
      length= MAX_BLOB_WIDTH;