From 444587d8a3c4b91421cd4cfd7bda2e3f4d1aebe4 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Tue, 16 Jan 2018 23:00:21 +0100 Subject: BIT field woes * get_rec_bits() was always reading two bytes, even if the bit field contained only of one byte * In various places the code used field->pack_length() bytes starting from field->ptr, while it should be field->pack_length_in_rec() * Field_bit::key_cmp and Field_bit::cmp_max passed field_length as an argument to memcmp(), but field_length is the number of bits! --- sql/field.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'sql/field.cc') diff --git a/sql/field.cc b/sql/field.cc index 08ba437fa30..5b111ab5e03 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -1758,7 +1758,7 @@ uint Field::fill_cache_field(CACHE_FIELD *copy) { uint store_length; copy->str= ptr; - copy->length= pack_length(); + copy->length= pack_length_in_rec(); copy->field= this; if (flags & BLOB_FLAG) { @@ -8422,7 +8422,7 @@ int Field_bit::cmp_max(const uchar *a, const uchar *b, uint max_len) if ((flag= (int) (bits_a - bits_b))) return flag; } - return memcmp(a, b, field_length); + return memcmp(a, b, bytes_in_rec); } @@ -8437,7 +8437,7 @@ int Field_bit::key_cmp(const uchar *str, uint length) str++; length--; } - return memcmp(ptr, str, length); + return memcmp(ptr, str, bytes_in_rec); } -- cgit v1.2.1 From b0a92333c00f8facd20c55cf7a8dfaf896b7f24d Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Fri, 9 Feb 2018 19:47:00 +0400 Subject: MDEV-15262 Wrong results for SELECT..WHERE non_indexed_datetime_column=indexed_time_column --- sql/field.cc | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'sql/field.cc') diff --git a/sql/field.cc b/sql/field.cc index c36fff06a07..a9a7d54929b 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -5330,6 +5330,13 @@ static void calc_datetime_days_diff(MYSQL_TIME *ltime, long days) ltime->second) * 1000000LL + ltime->second_part); unpack_time(timediff, ltime); + /* + unpack_time() broke down hours into ltime members hour,day,month. + Mix them back to ltime->hour using the same factors + that pack_time()/unpack_time() use (i.e. 32 for month). + */ + ltime->hour+= (ltime->month * 32 + ltime->day) * 24; + ltime->month= ltime->day= 0; } ltime->time_type= MYSQL_TIMESTAMP_TIME; } -- cgit v1.2.1