mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Follow-up to B-g#15776, test failures on 64-bit linux.
Make maximum blob size to be 2**32-1, regardless of word size. Fix failure of timestamp with size of 2**31-1. The method of rounding up to the nearest even number would overflow.
This commit is contained in:
24
sql/field.cc
24
sql/field.cc
@ -6848,6 +6848,7 @@ uint32 Field_blob::get_length(const char *pos)
|
||||
return (uint32) tmp;
|
||||
}
|
||||
}
|
||||
/* When expanding this, see also MAX_FIELD_BLOBLENGTH. */
|
||||
return 0; // Impossible
|
||||
}
|
||||
|
||||
@ -8395,11 +8396,11 @@ 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 != 0)
|
||||
if (fld_length != NULL)
|
||||
{
|
||||
errno= 0;
|
||||
length= strtoul(fld_length, NULL, 10);
|
||||
if (errno != 0)
|
||||
if ((errno != 0) || (length > MAX_FIELD_BLOBLENGTH))
|
||||
{
|
||||
my_error(ER_TOO_BIG_DISPLAYWIDTH, MYF(0), fld_name, MAX_FIELD_BLOBLENGTH);
|
||||
DBUG_RETURN(TRUE);
|
||||
@ -8556,7 +8557,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;
|
||||
@ -8565,12 +8566,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 */
|
||||
@ -8677,7 +8687,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)))
|
||||
{
|
||||
|
Reference in New Issue
Block a user