diff --git a/mysql-test/r/type_datetime.result b/mysql-test/r/type_datetime.result index 2a5d306cb23..dbaf91dcf07 100644 --- a/mysql-test/r/type_datetime.result +++ b/mysql-test/r/type_datetime.result @@ -436,6 +436,20 @@ f1 Warnings: Warning 1292 Incorrect datetime value: '0000-00-00 45:44:44' drop table t1; +create table t1 (a tinyint); +insert into t1 values (), (), (); +select sum(a) from t1 group by convert(a, datetime); +sum(a) +NULL +select convert(a, datetime) from t1; +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def convert(a, datetime) 12 29 0 Y 128 6 63 +convert(a, datetime) +NULL +NULL +NULL +drop table t1; +End of 5.0 tests set @org_mode=@@sql_mode; create table t1 (da date default '1962-03-03 23:33:34', dt datetime default '1962-03-03'); Warnings: diff --git a/mysql-test/t/type_datetime.test b/mysql-test/t/type_datetime.test index b02fc1a9af0..8f5f4bb5bd4 100644 --- a/mysql-test/t/type_datetime.test +++ b/mysql-test/t/type_datetime.test @@ -293,6 +293,19 @@ insert into t1 set f1 = '15:44:44'; select * from t1 where (convert(f1,datetime)) != 1; drop table t1; +# +# Bug #31249: problem with convert(..., datetime) +# +create table t1 (a tinyint); +insert into t1 values (), (), (); +select sum(a) from t1 group by convert(a, datetime); +--enable_metadata +select convert(a, datetime) from t1; +--disable_metadata +drop table t1; + +--echo End of 5.0 tests + # # Test of storing datetime into date fields # diff --git a/sql/item_timefunc.h b/sql/item_timefunc.h index 36556269d07..5503a172825 100644 --- a/sql/item_timefunc.h +++ b/sql/item_timefunc.h @@ -847,7 +847,9 @@ public: } void fix_length_and_dec() { - Item_typecast_maybe_null::fix_length_and_dec(); + collation.set(&my_charset_bin); + maybe_null= 1; + max_length= MAX_DATETIME_FULL_WIDTH * MY_CHARSET_BIN_MB_MAXLEN; decimals= DATETIME_DEC; } bool result_as_longlong() { return TRUE; } diff --git a/sql/sql_select.cc b/sql/sql_select.cc index b77bb719e1e..ba06c93e6b0 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -14370,13 +14370,31 @@ calc_group_buffer(JOIN *join,ORDER *group) group_item->decimals); break; case STRING_RESULT: + { + enum enum_field_types type= group_item->field_type(); /* - Group strings are taken as varstrings and require an length field. - A field is not yet created by create_tmp_field() - and the sizes should match up. + As items represented as DATE/TIME fields in the group buffer + have STRING_RESULT result type, we increase the length + by 8 as maximum pack length of such fields. */ - key_length+= group_item->max_length + HA_KEY_BLOB_LENGTH; + if (type == MYSQL_TYPE_TIME || + type == MYSQL_TYPE_DATE || + type == MYSQL_TYPE_DATETIME || + type == MYSQL_TYPE_TIMESTAMP) + { + key_length+= 8; + } + else + { + /* + Group strings are taken as varstrings and require an length field. + A field is not yet created by create_tmp_field() + and the sizes should match up. + */ + key_length+= group_item->max_length + HA_KEY_BLOB_LENGTH; + } break; + } default: /* This case should never be choosen */ DBUG_ASSERT(0);