Merge from 5.3

modified:
  mysql-test/r/dyncol.result
  mysql-test/r/type_time.result
  mysql-test/t/dyncol.test
  mysql-test/t/type_time.test
  mysys/ma_dyncol.c
  sql/item.cc
  sql/item_func.cc
pending merges:
  Alexander Barkov 2013-08-12 MDEV-4652 Wrong result for CONCAT(GREATEST(T...
    sanja@montyprogr... 2013-08-01 MDEV-4811 Assertion `offset < 0x1f' f...
This commit is contained in:
Alexander Barkov 2013-08-12 17:33:08 +04:00
commit b59738a598
7 changed files with 86 additions and 10 deletions

View File

@ -1404,5 +1404,26 @@ v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VI
drop view v1; drop view v1;
drop table t1; drop table t1;
# #
# MDEV-4811: Assertion `offset < 0x1f' fails in type_and_offset_store
# on COLUMN_ADD
#
CREATE TABLE t1 (dyn TINYBLOB) ENGINE=MyISAM;
INSERT INTO t1 SET dyn = COLUMN_CREATE( 40, REPEAT('a', 233), 4, REPEAT('b', 322) );
Warnings:
Warning 1265 Data truncated for column 'dyn' at row 1
SELECT COLUMN_ADD( dyn, 6, REPEAT('x',80), 4, REPEAT('y',215) AS INTEGER ) FROM t1;
ERROR HY000: Encountered illegal format of dynamic column string
DROP table t1;
#
# MDEV-4812: Valgrind warnings (Invalid write) in
# dynamic_column_update_many on COLUMN_ADD
#
CREATE TABLE t1 (dyncol TINYBLOB) ENGINE=MyISAM;
INSERT INTO t1 SET dyncol = COLUMN_CREATE( 7, REPEAT('k',487), 209, REPEAT('x',464) );
Warnings:
Warning 1265 Data truncated for column 'dyncol' at row 1
SELECT COLUMN_ADD( dyncol, 7, '22:22:22', 8, REPEAT('x',270) AS CHAR ) FROM t1;
DROP table t1;
#
# end of 5.3 tests # end of 5.3 tests
# #

View File

@ -183,6 +183,15 @@ NULL
Warnings: Warnings:
Warning 1292 Incorrect datetime value: '0000-00-00 00:00:00' Warning 1292 Incorrect datetime value: '0000-00-00 00:00:00'
# #
# MDEV-4652 Wrong result for CONCAT(GREATEST(TIME('00:00:01'),TIME('00:00:00')))
#
SELECT CONCAT(GREATEST(TIME('00:00:01'),TIME('00:00:00')));
CONCAT(GREATEST(TIME('00:00:01'),TIME('00:00:00')))
00:00:01.000000
SELECT CONCAT(GREATEST(TIME('32 00:00:01'),TIME('00:00:00')));
CONCAT(GREATEST(TIME('32 00:00:01'),TIME('00:00:00')))
768:00:01.000000
#
# End of 5.3 tests # End of 5.3 tests
# #
CREATE TABLE t1 (f1 TIME); CREATE TABLE t1 (f1 TIME);

View File

@ -603,6 +603,29 @@ drop view v1;
drop table t1; drop table t1;
--echo #
--echo # MDEV-4811: Assertion `offset < 0x1f' fails in type_and_offset_store
--echo # on COLUMN_ADD
--echo #
CREATE TABLE t1 (dyn TINYBLOB) ENGINE=MyISAM;
INSERT INTO t1 SET dyn = COLUMN_CREATE( 40, REPEAT('a', 233), 4, REPEAT('b', 322) );
--error ER_DYN_COL_WRONG_FORMAT
SELECT COLUMN_ADD( dyn, 6, REPEAT('x',80), 4, REPEAT('y',215) AS INTEGER ) FROM t1;
DROP table t1;
--echo #
--echo # MDEV-4812: Valgrind warnings (Invalid write) in
--echo # dynamic_column_update_many on COLUMN_ADD
--echo #
CREATE TABLE t1 (dyncol TINYBLOB) ENGINE=MyISAM;
INSERT INTO t1 SET dyncol = COLUMN_CREATE( 7, REPEAT('k',487), 209, REPEAT('x',464) );
--error 0,ER_DYN_COL_WRONG_FORMAT
SELECT COLUMN_ADD( dyncol, 7, '22:22:22', 8, REPEAT('x',270) AS CHAR ) FROM t1;
DROP table t1;
--echo # --echo #
--echo # end of 5.3 tests --echo # end of 5.3 tests
--echo # --echo #

View File

@ -128,6 +128,12 @@ drop table t1;
--echo # --echo #
SELECT CONVERT_TZ(GREATEST(TIME('00:00:00'),TIME('00:00:00')),'+00:00','+7:5'); SELECT CONVERT_TZ(GREATEST(TIME('00:00:00'),TIME('00:00:00')),'+00:00','+7:5');
--echo #
--echo # MDEV-4652 Wrong result for CONCAT(GREATEST(TIME('00:00:01'),TIME('00:00:00')))
--echo #
SELECT CONCAT(GREATEST(TIME('00:00:01'),TIME('00:00:00')));
SELECT CONCAT(GREATEST(TIME('32 00:00:01'),TIME('00:00:00')));
--echo # --echo #
--echo # End of 5.3 tests --echo # End of 5.3 tests
--echo # --echo #

View File

@ -1227,13 +1227,14 @@ dynamic_column_create(DYNAMIC_COLUMN *str, uint column_nr,
@param header_end Pointer to the header end @param header_end Pointer to the header end
@param offset_size Size of offset field in bytes @param offset_size Size of offset field in bytes
@param last_offset Size of the data segment @param last_offset Size of the data segment
@param error Set in case of error
@return number of bytes @return number of bytes
*/ */
static size_t get_length_interval(uchar *entry, uchar *entry_next, static size_t get_length_interval(uchar *entry, uchar *entry_next,
uchar *header_end, size_t offset_size, uchar *header_end, size_t offset_size,
size_t last_offset) size_t last_offset, my_bool *error)
{ {
size_t offset, offset_next; size_t offset, offset_next;
DYNAMIC_COLUMN_TYPE type, type_next; DYNAMIC_COLUMN_TYPE type, type_next;
@ -1241,8 +1242,12 @@ static size_t get_length_interval(uchar *entry, uchar *entry_next,
type_and_offset_read(&type, &offset, entry, offset_size); type_and_offset_read(&type, &offset, entry, offset_size);
if (entry_next >= header_end) if (entry_next >= header_end)
{
*error= 0;
return (last_offset - offset); return (last_offset - offset);
}
type_and_offset_read(&type_next, &offset_next, entry_next, offset_size); type_and_offset_read(&type_next, &offset_next, entry_next, offset_size);
*error= (offset_next > last_offset);
return (offset_next - offset); return (offset_next - offset);
} }
@ -1254,17 +1259,18 @@ static size_t get_length_interval(uchar *entry, uchar *entry_next,
@param header_end Pointer to the header end @param header_end Pointer to the header end
@param offset_size Size of offset field in bytes @param offset_size Size of offset field in bytes
@param last_offset Size of the data segment @param last_offset Size of the data segment
@param error Set in case of error
@return number of bytes @return number of bytes
*/ */
static size_t get_length(uchar *entry, uchar *header_end, static size_t get_length(uchar *entry, uchar *header_end,
size_t offset_size, size_t offset_size,
size_t last_offset) size_t last_offset, my_bool *error)
{ {
return get_length_interval(entry, return get_length_interval(entry,
entry + offset_size + COLUMN_NUMBER_SIZE, entry + offset_size + COLUMN_NUMBER_SIZE,
header_end, offset_size, last_offset); header_end, offset_size, last_offset, error);
} }
@ -1303,6 +1309,7 @@ find_column(DYNAMIC_COLUMN_TYPE *type, uchar **data, size_t *length,
uchar *entry; uchar *entry;
size_t offset, total_data, header_size, entry_size; size_t offset, total_data, header_size, entry_size;
uchar key[2+4]; uchar key[2+4];
my_bool error;
if (!entry_pos) if (!entry_pos)
entry_pos= &entry; entry_pos= &entry;
@ -1328,12 +1335,12 @@ find_column(DYNAMIC_COLUMN_TYPE *type, uchar **data, size_t *length,
return 1; return 1;
*data= header + header_size + offset; *data= header + header_size + offset;
*length= get_length(entry, header + header_size, offset_size, *length= get_length(entry, header + header_size, offset_size,
total_data); total_data, &error);
/* /*
Check that the found data is withing the ranges. This can happen if Check that the found data is withing the ranges. This can happen if
we get data with wrong offsets. we get data with wrong offsets.
*/ */
if ((long) *length < 0 || offset + *length > total_data) if (error || (long) *length < 0 || offset + *length > total_data)
return 1; return 1;
*entry_pos= entry; *entry_pos= entry;
@ -1835,12 +1842,13 @@ dynamic_column_update_many(DYNAMIC_COLUMN *str,
entry_size, column_count, &entry)) entry_size, column_count, &entry))
{ {
size_t entry_data_size; size_t entry_data_size;
my_bool error;
/* Data existed; We have to replace or delete it */ /* Data existed; We have to replace or delete it */
entry_data_size= get_length(entry, header_end, entry_data_size= get_length(entry, header_end,
offset_size, max_offset); offset_size, max_offset, &error);
if ((long) entry_data_size < 0) if (error || (long) entry_data_size < 0)
{ {
rc= ER_DYNCOL_FORMAT; rc= ER_DYNCOL_FORMAT;
goto end; goto end;
@ -2036,12 +2044,13 @@ dynamic_column_update_many(DYNAMIC_COLUMN *str,
/* copy first the data that was not replaced in original packed data */ /* copy first the data that was not replaced in original packed data */
if (start < end) if (start < end)
{ {
my_bool error;
/* Add old data last in 'tmp' */ /* Add old data last in 'tmp' */
size_t data_size= size_t data_size=
get_length_interval(header_base + start * entry_size, get_length_interval(header_base + start * entry_size,
header_base + end * entry_size, header_base + end * entry_size,
header_end, offset_size, max_offset); header_end, offset_size, max_offset, &error);
if ((long) data_size < 0 || if (error || (long) data_size < 0 ||
data_size > max_offset - first_offset) data_size > max_offset - first_offset)
{ {
dynamic_column_column_free(&tmp); dynamic_column_column_free(&tmp);

View File

@ -297,7 +297,8 @@ String *Item::val_string_from_decimal(String *str)
String *Item::val_string_from_date(String *str) String *Item::val_string_from_date(String *str)
{ {
MYSQL_TIME ltime; MYSQL_TIME ltime;
if (get_date(&ltime, 0) || if (get_date(&ltime,
field_type() == MYSQL_TYPE_TIME ? TIME_TIME_ONLY : 0) ||
str->alloc(MAX_DATE_STRING_REP_LENGTH)) str->alloc(MAX_DATE_STRING_REP_LENGTH))
{ {
null_value= 1; null_value= 1;

View File

@ -2791,6 +2791,13 @@ bool Item_func_min_max::get_date(MYSQL_TIME *ltime, ulonglong fuzzy_date)
ltime->time_type= MYSQL_TIMESTAMP_DATE; ltime->time_type= MYSQL_TIMESTAMP_DATE;
ltime->hour= ltime->minute= ltime->second= ltime->second_part= 0; ltime->hour= ltime->minute= ltime->second= ltime->second_part= 0;
} }
else if (compare_as_dates->field_type() == MYSQL_TYPE_TIME)
{
ltime->time_type= MYSQL_TIMESTAMP_TIME;
ltime->hour+= (ltime->month * 32 + ltime->day) * 24;
ltime->month= ltime->day= 0;
}
return (null_value= 0); return (null_value= 0);
} }