Loading mysql-test/r/func_if.result +7 −0 Original line number Diff line number Diff line Loading @@ -121,3 +121,10 @@ a NULLIF(a,'') NULL NULL NULL DROP TABLE t1; create table t1 (f1 int, f2 int); insert into t1 values(1,1),(0,0); select f1, f2, if(f1, 40.0, 5.00) from t1 group by f1 order by f2; f1 f2 if(f1, 40.0, 5.00) 0 0 5.00 1 1 40.00 drop table t1; mysql-test/t/func_if.test +8 −0 Original line number Diff line number Diff line Loading @@ -89,3 +89,11 @@ SELECT a, NULLIF(a,'') FROM t1 WHERE NULLIF(a,'') IS NULL; DROP TABLE t1; # End of 4.1 tests # # Bug #16272 IF function with decimal args can produce wrong result # create table t1 (f1 int, f2 int); insert into t1 values(1,1),(0,0); select f1, f2, if(f1, 40.0, 5.00) from t1 group by f1 order by f2; drop table t1; sql/item_cmpfunc.cc +2 −1 Original line number Diff line number Diff line Loading @@ -1383,7 +1383,8 @@ Item_func_if::fix_length_and_dec() max_length= (cached_result_type == DECIMAL_RESULT || cached_result_type == INT_RESULT) ? (max(args[1]->max_length - args[1]->decimals, args[2]->max_length - args[2]->decimals) + decimals) : args[2]->max_length - args[2]->decimals) + decimals + (unsigned_flag ? 0 : 1) ) : max(args[1]->max_length, args[2]->max_length); } Loading sql/sql_select.cc +4 −3 Original line number Diff line number Diff line Loading @@ -12746,11 +12746,12 @@ calc_group_buffer(JOIN *join,ORDER *group) Field *field= group_item->get_tmp_table_field(); if (field) { if (field->type() == FIELD_TYPE_BLOB) enum_field_types type; if ((type= field->type()) == FIELD_TYPE_BLOB) key_length+=MAX_BLOB_WIDTH; // Can't be used as a key else if (field->type() == MYSQL_TYPE_VARCHAR) else if (type == MYSQL_TYPE_VARCHAR || type == MYSQL_TYPE_VAR_STRING) key_length+= field->field_length + HA_KEY_BLOB_LENGTH; else if (field->type() == FIELD_TYPE_BIT) else if (type == FIELD_TYPE_BIT) { /* Bit is usually stored as a longlong key for group fields */ key_length+= 8; // Big enough Loading Loading
mysql-test/r/func_if.result +7 −0 Original line number Diff line number Diff line Loading @@ -121,3 +121,10 @@ a NULLIF(a,'') NULL NULL NULL DROP TABLE t1; create table t1 (f1 int, f2 int); insert into t1 values(1,1),(0,0); select f1, f2, if(f1, 40.0, 5.00) from t1 group by f1 order by f2; f1 f2 if(f1, 40.0, 5.00) 0 0 5.00 1 1 40.00 drop table t1;
mysql-test/t/func_if.test +8 −0 Original line number Diff line number Diff line Loading @@ -89,3 +89,11 @@ SELECT a, NULLIF(a,'') FROM t1 WHERE NULLIF(a,'') IS NULL; DROP TABLE t1; # End of 4.1 tests # # Bug #16272 IF function with decimal args can produce wrong result # create table t1 (f1 int, f2 int); insert into t1 values(1,1),(0,0); select f1, f2, if(f1, 40.0, 5.00) from t1 group by f1 order by f2; drop table t1;
sql/item_cmpfunc.cc +2 −1 Original line number Diff line number Diff line Loading @@ -1383,7 +1383,8 @@ Item_func_if::fix_length_and_dec() max_length= (cached_result_type == DECIMAL_RESULT || cached_result_type == INT_RESULT) ? (max(args[1]->max_length - args[1]->decimals, args[2]->max_length - args[2]->decimals) + decimals) : args[2]->max_length - args[2]->decimals) + decimals + (unsigned_flag ? 0 : 1) ) : max(args[1]->max_length, args[2]->max_length); } Loading
sql/sql_select.cc +4 −3 Original line number Diff line number Diff line Loading @@ -12746,11 +12746,12 @@ calc_group_buffer(JOIN *join,ORDER *group) Field *field= group_item->get_tmp_table_field(); if (field) { if (field->type() == FIELD_TYPE_BLOB) enum_field_types type; if ((type= field->type()) == FIELD_TYPE_BLOB) key_length+=MAX_BLOB_WIDTH; // Can't be used as a key else if (field->type() == MYSQL_TYPE_VARCHAR) else if (type == MYSQL_TYPE_VARCHAR || type == MYSQL_TYPE_VAR_STRING) key_length+= field->field_length + HA_KEY_BLOB_LENGTH; else if (field->type() == FIELD_TYPE_BIT) else if (type == FIELD_TYPE_BIT) { /* Bit is usually stored as a longlong key for group fields */ key_length+= 8; // Big enough Loading