Commit 02e6c839 authored by cmiller@zippy.cornsilk.net's avatar cmiller@zippy.cornsilk.net
Browse files

Merge zippy.cornsilk.net:/home/cmiller/work/mysql/bug15776/my50-bug15776

into  zippy.cornsilk.net:/home/cmiller/work/mysql/bug15776-encore/my50-bug15776-encore
parents 7498f9e6 3e2457b7
Loading
Loading
Loading
Loading
+152 −0
Original line number Diff line number Diff line
@@ -821,4 +821,156 @@ LENGTH(c) CHAR_LENGTH(c)
65535	65535
65535	65535
DROP TABLE t;
drop table if exists b15776;
create table b15776 (data blob(2147483647));
drop table b15776;
create table b15776 (data blob(-1));
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-1))' at line 1
create table b15776 (data blob(2147483648));
drop table b15776;
create table b15776 (data blob(4294967294));
drop table b15776;
create table b15776 (data blob(4294967295));
drop table b15776;
create table b15776 (data blob(4294967296));
ERROR 42000: Display width out of range for column 'data' (max = 4294967295)
CREATE TABLE b15776 (a blob(2147483647), b blob(2147483648), c blob(4294967295), a1 text(2147483647), b1 text(2147483648), c1 text(4294967295) );
show columns from b15776;
Field	Type	Null	Key	Default	Extra
a	longblob	YES		NULL	
b	longblob	YES		NULL	
c	longblob	YES		NULL	
a1	longtext	YES		NULL	
b1	longtext	YES		NULL	
c1	longtext	YES		NULL	
drop table b15776;
CREATE TABLE b15776 (a blob(4294967296));
ERROR 42000: Display width out of range for column 'a' (max = 4294967295)
CREATE TABLE b15776 (a text(4294967296));
ERROR 42000: Display width out of range for column 'a' (max = 4294967295)
CREATE TABLE b15776 (a blob(999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999));
ERROR 42000: Display width out of range for column 'a' (max = 4294967295)
CREATE TABLE b15776 (a text(999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999));
ERROR 42000: Display width out of range for column 'a' (max = 4294967295)
CREATE TABLE b15776 (a int(0));
INSERT INTO b15776 values (NULL), (1), (42), (654);
SELECT * from b15776 ORDER BY a;
a
NULL
1
42
654
DROP TABLE b15776;
CREATE TABLE b15776 (a int(-1));
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-1))' at line 1
CREATE TABLE b15776 (a int(255));
DROP TABLE b15776;
CREATE TABLE b15776 (a int(256));
ERROR 42000: Display width out of range for column 'a' (max = 255)
CREATE TABLE b15776 (data blob(-1));
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-1))' at line 1
CREATE TABLE b15776 (a char(2147483647));
ERROR 42000: Column length too big for column 'a' (max = 255); use BLOB or TEXT instead
CREATE TABLE b15776 (a char(2147483648));
ERROR 42000: Column length too big for column 'a' (max = 255); use BLOB or TEXT instead
CREATE TABLE b15776 (a char(4294967295));
ERROR 42000: Column length too big for column 'a' (max = 255); use BLOB or TEXT instead
CREATE TABLE b15776 (a char(4294967296));
ERROR 42000: Display width out of range for column 'a' (max = 4294967295)
CREATE TABLE b15776 (a year(4294967295));
INSERT INTO b15776 VALUES (42);
SELECT * FROM b15776;
a
2042
DROP TABLE b15776;
CREATE TABLE b15776 (a year(4294967296));
ERROR 42000: Display width out of range for column 'a' (max = 4294967295)
CREATE TABLE b15776 (a year(0));
DROP TABLE b15776;
CREATE TABLE b15776 (a year(-2));
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-2))' at line 1
CREATE TABLE b15776 (a timestamp(4294967294));
Warnings:
Warning	1287	'TIMESTAMP(4294967294)' is deprecated; use 'TIMESTAMP' instead
DROP TABLE b15776;
CREATE TABLE b15776 (a timestamp(4294967295));
Warnings:
Warning	1287	'TIMESTAMP(4294967295)' is deprecated; use 'TIMESTAMP' instead
DROP TABLE b15776;
CREATE TABLE b15776 (a timestamp(4294967296));
ERROR 42000: Display width out of range for column 'a' (max = 4294967295)
CREATE TABLE b15776 (a timestamp(-1));
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-1))' at line 1
CREATE TABLE b15776 (a timestamp(-2));
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-2))' at line 1
CREATE TABLE b15776 (a int(999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999));
ERROR 42000: Display width out of range for column 'a' (max = 4294967295)
CREATE TABLE b15776 (a char(999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999));
ERROR 42000: Display width out of range for column 'a' (max = 4294967295)
CREATE TABLE b15776 (a year(999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999));
ERROR 42000: Display width out of range for column 'a' (max = 4294967295)
CREATE TABLE b15776 (a timestamp(999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999));
ERROR 42000: Display width out of range for column 'a' (max = 4294967295)
CREATE TABLE b15776 select cast(null as char(4294967295));
show columns from b15776;
Field	Type	Null	Key	Default	Extra
cast(null as char(4294967295))	char(0)	YES		NULL	
drop table b15776;
CREATE TABLE b15776 select cast(null as nchar(4294967295));
show columns from b15776;
Field	Type	Null	Key	Default	Extra
cast(null as nchar(4294967295))	char(0)	YES		NULL	
drop table b15776;
CREATE TABLE b15776 select cast(null as binary(4294967295));
show columns from b15776;
Field	Type	Null	Key	Default	Extra
cast(null as binary(4294967295))	binary(0)	YES		NULL	
drop table b15776;
explain select cast(1 as char(4294967295));
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	NULL	NULL	NULL	NULL	NULL	NULL	NULL	No tables used
explain select cast(1 as nchar(4294967295));
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	NULL	NULL	NULL	NULL	NULL	NULL	NULL	No tables used
explain select cast(1 as binary(4294967295));
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	NULL	NULL	NULL	NULL	NULL	NULL	NULL	No tables used
explain select cast(1 as char(4294967296));
ERROR 42000: Display width out of range for column 'cast as char' (max = 4294967295)
explain select cast(1 as nchar(4294967296));
ERROR 42000: Display width out of range for column 'cast as char' (max = 4294967295)
explain select cast(1 as binary(4294967296));
ERROR 42000: Display width out of range for column 'cast as char' (max = 4294967295)
explain select cast(1 as decimal(-1));
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-1))' at line 1
explain select cast(1 as decimal(64, 30));
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	NULL	NULL	NULL	NULL	NULL	NULL	NULL	No tables used
explain select cast(1 as decimal(64, 999999999999999999999999999999));
Got one of the listed errors
explain select cast(1 as decimal(4294967296));
Got one of the listed errors
explain select cast(1 as decimal(999999999999999999999999999999999999));
Got one of the listed errors
explain select convert(1, char(4294967295));
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	NULL	NULL	NULL	NULL	NULL	NULL	NULL	No tables used
explain select convert(1, char(4294967296));
ERROR 42000: Display width out of range for column 'cast as char' (max = 4294967295)
explain select convert(1, char(999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999));
ERROR 42000: Display width out of range for column 'cast as char' (max = 4294967295)
explain select convert(1, nchar(4294967295));
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	NULL	NULL	NULL	NULL	NULL	NULL	NULL	No tables used
explain select convert(1, nchar(4294967296));
ERROR 42000: Display width out of range for column 'cast as char' (max = 4294967295)
explain select convert(1, nchar(999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999));
ERROR 42000: Display width out of range for column 'cast as char' (max = 4294967295)
explain select convert(1, binary(4294967295));
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	NULL	NULL	NULL	NULL	NULL	NULL	NULL	No tables used
explain select convert(1, binary(4294967296));
ERROR 42000: Display width out of range for column 'cast as char' (max = 4294967295)
explain select convert(1, binary(999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999));
ERROR 42000: Display width out of range for column 'cast as char' (max = 4294967295)
End of 5.0 tests
+164 −0
Original line number Diff line number Diff line
@@ -446,5 +446,169 @@ INSERT INTO t (c) VALUES (REPEAT('2',65536));
INSERT INTO t (c) VALUES (REPEAT('3',65535));
SELECT LENGTH(c), CHAR_LENGTH(c) FROM t;
DROP TABLE t;
# Bug#15776: 32-bit signed int used for length of blob
# """LONGBLOB:  A BLOB column with a maximum length of 4,294,967,295 or 4GB."""
#
# Conditions should be in this order:
# A size is not in the allowed bounds.
# If the type is char-ish AND size is within the max blob size:
#   raise ER_TOO_BIG_FIELDLENGTH  (suggest using BLOB)
# If size is too small:
#   raise ER_PARSE_ERROR
# raise ER_TOO_BIG_DISPLAYWIDTH

# BLOB and TEXT types
--disable_warnings
drop table if exists b15776;
--enable_warnings
create table b15776 (data blob(2147483647));
drop table b15776;
--error ER_PARSE_ERROR
create table b15776 (data blob(-1));
create table b15776 (data blob(2147483648));
drop table b15776;
create table b15776 (data blob(4294967294));
drop table b15776;
create table b15776 (data blob(4294967295));
drop table b15776;
--error ER_TOO_BIG_DISPLAYWIDTH
create table b15776 (data blob(4294967296));

CREATE TABLE b15776 (a blob(2147483647), b blob(2147483648), c blob(4294967295), a1 text(2147483647), b1 text(2147483648), c1 text(4294967295) );
show columns from b15776;
drop table b15776;

--error ER_TOO_BIG_DISPLAYWIDTH
CREATE TABLE b15776 (a blob(4294967296));
--error ER_TOO_BIG_DISPLAYWIDTH
CREATE TABLE b15776 (a text(4294967296));
--error ER_TOO_BIG_DISPLAYWIDTH
CREATE TABLE b15776 (a blob(999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999));
--error ER_TOO_BIG_DISPLAYWIDTH
CREATE TABLE b15776 (a text(999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999));

# Int types
# "Another extension is supported by MySQL for optionally specifying the
# display width of integer data types in parentheses following the base keyword
# for the type (for example, INT(4)). This optional display width is used to
# display integer values having a width less than the width specified for the
# column by left-padding them with spaces."   § Numeric Types
CREATE TABLE b15776 (a int(0)); # 0 is special case, means default size
INSERT INTO b15776 values (NULL), (1), (42), (654);
SELECT * from b15776 ORDER BY a;
DROP TABLE b15776;
--error ER_PARSE_ERROR
CREATE TABLE b15776 (a int(-1));
CREATE TABLE b15776 (a int(255));
DROP TABLE b15776;
--error ER_TOO_BIG_DISPLAYWIDTH
CREATE TABLE b15776 (a int(256));
--error ER_PARSE_ERROR
CREATE TABLE b15776 (data blob(-1));

# Char types
# Recommend BLOB
--error ER_TOO_BIG_FIELDLENGTH
CREATE TABLE b15776 (a char(2147483647));
--error ER_TOO_BIG_FIELDLENGTH
CREATE TABLE b15776 (a char(2147483648));
--error ER_TOO_BIG_FIELDLENGTH
CREATE TABLE b15776 (a char(4294967295));
# Even BLOB won't hold
--error ER_TOO_BIG_DISPLAYWIDTH
CREATE TABLE b15776 (a char(4294967296));


# Other numeric-ish types
## For year, widths not "2" or "4" are silently rewritten to "4".  But
## When we complain about it, we say that the max is 255.  We may be 
## talking about different things.  It's confusing.
CREATE TABLE b15776 (a year(4294967295));
INSERT INTO b15776 VALUES (42);
SELECT * FROM b15776;
DROP TABLE b15776;
--error ER_TOO_BIG_DISPLAYWIDTH
CREATE TABLE b15776 (a year(4294967296));
CREATE TABLE b15776 (a year(0));  # 0 is special case, means default size
DROP TABLE b15776;
--error ER_PARSE_ERROR
CREATE TABLE b15776 (a year(-2));

## For timestamp, we silently rewrite widths to 14 or 19.
CREATE TABLE b15776 (a timestamp(4294967294));
DROP TABLE b15776;
CREATE TABLE b15776 (a timestamp(4294967295));
DROP TABLE b15776;
--error ER_TOO_BIG_DISPLAYWIDTH
CREATE TABLE b15776 (a timestamp(4294967296));
--error ER_PARSE_ERROR
CREATE TABLE b15776 (a timestamp(-1));
--error ER_PARSE_ERROR
CREATE TABLE b15776 (a timestamp(-2));


# We've already tested the case, but this should visually show that 
# widths that are too large to be interpreted cause DISPLAYWIDTH errors.
--error ER_TOO_BIG_DISPLAYWIDTH
CREATE TABLE b15776 (a int(999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999));
--error ER_TOO_BIG_DISPLAYWIDTH
CREATE TABLE b15776 (a char(999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999));
--error ER_TOO_BIG_DISPLAYWIDTH
CREATE TABLE b15776 (a year(999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999));
--error ER_TOO_BIG_DISPLAYWIDTH
CREATE TABLE b15776 (a timestamp(999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999));

## Do not select, too much memory needed.
CREATE TABLE b15776 select cast(null as char(4294967295));
show columns from b15776;
drop table b15776;
CREATE TABLE b15776 select cast(null as nchar(4294967295));
show columns from b15776;
drop table b15776;
CREATE TABLE b15776 select cast(null as binary(4294967295));
show columns from b15776;
drop table b15776;

explain select cast(1 as char(4294967295));
explain select cast(1 as nchar(4294967295));
explain select cast(1 as binary(4294967295));

--error ER_TOO_BIG_DISPLAYWIDTH
explain select cast(1 as char(4294967296));
--error ER_TOO_BIG_DISPLAYWIDTH
explain select cast(1 as nchar(4294967296));
--error ER_TOO_BIG_DISPLAYWIDTH
explain select cast(1 as binary(4294967296));

--error ER_PARSE_ERROR
explain select cast(1 as decimal(-1));
explain select cast(1 as decimal(64, 30));
# It's not as important which errors are raised for these, since the 
# limit is nowhere near 2**32.  We may fix these eventually to take
# 4294967295 and still reject it because it's greater than 64 or 30, 
# but that's not a high priority and the parser needn't worry about 
# such a weird case.
--error ER_TOO_BIG_SCALE,ER_PARSE_ERROR
explain select cast(1 as decimal(64, 999999999999999999999999999999));
--error ER_TOO_BIG_PRECISION,ER_PARSE_ERROR
explain select cast(1 as decimal(4294967296));
--error ER_TOO_BIG_PRECISION,ER_PARSE_ERROR
explain select cast(1 as decimal(999999999999999999999999999999999999));

explain select convert(1, char(4294967295));
--error ER_TOO_BIG_DISPLAYWIDTH
explain select convert(1, char(4294967296));
--error ER_TOO_BIG_DISPLAYWIDTH
explain select convert(1, char(999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999));
explain select convert(1, nchar(4294967295));
--error ER_TOO_BIG_DISPLAYWIDTH
explain select convert(1, nchar(4294967296));
--error ER_TOO_BIG_DISPLAYWIDTH
explain select convert(1, nchar(999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999));
explain select convert(1, binary(4294967295));
--error ER_TOO_BIG_DISPLAYWIDTH
explain select convert(1, binary(4294967296));
--error ER_TOO_BIG_DISPLAYWIDTH
explain select convert(1, binary(999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999));

--echo End of 5.0 tests
+29 −7
Original line number Diff line number Diff line
@@ -6930,6 +6930,7 @@ uint32 Field_blob::get_length(const char *pos)
      return (uint32) tmp;
    }
  }
  /* When expanding this, see also MAX_FIELD_BLOBLENGTH. */
  return 0;					// Impossible
}

@@ -8441,8 +8442,20 @@ bool create_field::init(THD *thd, char *fld_name, enum_field_types fld_type,
      (fld_type_modifier & NOT_NULL_FLAG) && fld_type != FIELD_TYPE_TIMESTAMP)
    flags|= NO_DEFAULT_VALUE_FLAG;

  if (fld_length && !(length= (uint) atoi(fld_length)))
  if (fld_length != NULL)
  {
    errno= 0;
    length= strtoul(fld_length, NULL, 10);
    if ((errno != 0) || (length > MAX_FIELD_BLOBLENGTH))
    {
      my_error(ER_TOO_BIG_DISPLAYWIDTH, MYF(0), fld_name, MAX_FIELD_BLOBLENGTH);
      DBUG_RETURN(TRUE);
    }

    if (length == 0)
      fld_length= 0; /* purecov: inspected */
  }

  sign_len= fld_type_modifier & UNSIGNED_FLAG ? 0 : 1;

  switch (fld_type) {
@@ -8590,7 +8603,7 @@ bool create_field::init(THD *thd, char *fld_name, enum_field_types fld_type,
    }
    break;
  case FIELD_TYPE_TIMESTAMP:
    if (!fld_length)
    if (fld_length == NULL)
    {
      /* Compressed date YYYYMMDDHHMMSS */
      length= MAX_DATETIME_COMPRESSED_WIDTH;
@@ -8599,12 +8612,21 @@ bool create_field::init(THD *thd, char *fld_name, enum_field_types fld_type,
    {
      /*
        We support only even TIMESTAMP lengths less or equal than 14
        and 19 as length of 4.1 compatible representation.
        and 19 as length of 4.1 compatible representation.  Silently 
        shrink it to MAX_DATETIME_COMPRESSED_WIDTH.
      */
      length= ((length+1)/2)*2; /* purecov: inspected */
      length= min(length, MAX_DATETIME_COMPRESSED_WIDTH); /* purecov: inspected */
	  DBUG_ASSERT(MAX_DATETIME_COMPRESSED_WIDTH < UINT_MAX);
      if (length != UINT_MAX)  /* avoid overflow; is safe because of min() */
        length= ((length+1)/2)*2;
      length= min(length, MAX_DATETIME_COMPRESSED_WIDTH);
    }
    flags|= ZEROFILL_FLAG | UNSIGNED_FLAG;
    /*
      Since we silently rewrite down to MAX_DATETIME_COMPRESSED_WIDTH bytes,
      the parser should not raise errors unless bizzarely large. 
     */
    max_field_charlength= UINT_MAX;

    if (fld_default_value)
    {
      /* Grammar allows only NOW() value for ON UPDATE clause */
@@ -8711,7 +8733,7 @@ bool create_field::init(THD *thd, char *fld_name, enum_field_types fld_type,
      ((length > max_field_charlength && fld_type != FIELD_TYPE_SET &&
        fld_type != FIELD_TYPE_ENUM &&
        (fld_type != MYSQL_TYPE_VARCHAR || fld_default_value)) ||
       (!length &&
       ((length == 0) &&
        fld_type != MYSQL_TYPE_STRING &&
        fld_type != MYSQL_TYPE_VARCHAR && fld_type != FIELD_TYPE_GEOMETRY)))
  {
+54 −3
Original line number Diff line number Diff line
@@ -464,8 +464,42 @@ Item *create_func_cast(Item *a, Cast_target cast_type,
  case ITEM_CAST_TIME:		res= new Item_time_typecast(a); break;
  case ITEM_CAST_DATETIME:	res= new Item_datetime_typecast(a); break;
  case ITEM_CAST_DECIMAL:
    len= c_len ? atoi(c_len) : 0;
    dec= c_dec ? atoi(c_dec) : 0;
    if (c_len == NULL)
    {
      len= 0;
    }
    else
    {
      ulong decoded_size;
      errno= 0;
      decoded_size= strtoul(c_len, NULL, 10);
      if (errno != 0)
      {
        my_error(ER_TOO_BIG_PRECISION, MYF(0), c_len, a->name,
                 DECIMAL_MAX_PRECISION);
        return NULL;
      }
      len= decoded_size;
    }

    if (c_dec == NULL)
    {
      dec= 0;
    }
    else
    {
      ulong decoded_size;
      errno= 0;
      decoded_size= strtoul(c_dec, NULL, 10);
      if ((errno != 0) || (decoded_size > UINT_MAX))
      {
        my_error(ER_TOO_BIG_SCALE, MYF(0), c_dec, a->name,
                 DECIMAL_MAX_SCALE);
        return NULL;
      }
      dec= decoded_size;
    }

    my_decimal_trim(&len, &dec);
    if (len < dec)
    {
@@ -486,8 +520,25 @@ Item *create_func_cast(Item *a, Cast_target cast_type,
    }
    res= new Item_decimal_typecast(a, len, dec);
    break;

  case ITEM_CAST_CHAR:
    len= c_len ? atoi(c_len) : -1;
    if (c_len == NULL)
    {
      len= LL(-1);
    }
    else
    {
      ulong decoded_size;
      errno= 0;
      decoded_size= strtoul(c_len, NULL, 10);
      if (errno != 0)
      {
        my_error(ER_TOO_BIG_DISPLAYWIDTH, MYF(0), "cast as char", MAX_FIELD_BLOBLENGTH);
        return NULL;
      }
      len= decoded_size;
    }

    res= new Item_char_typecast(a, len, cs ? cs : 
				current_thd->variables.collation_connection);
    break;
+30 −30

File changed.

Preview size limit exceeded, changes collapsed.

Loading