diff options
author | Alexander Barkov <bar@mariadb.com> | 2018-05-31 18:52:32 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2018-05-31 18:52:32 +0400 |
commit | ffe83e8e7bef32eb2a80aad2d382f0b023dd3a44 (patch) | |
tree | 065bfa8c2afb2dcb2096e40d18c2e56a61eae47f /sql/field.cc | |
parent | 3ceb4a54a178d3e92529b4be16e866e18fd15218 (diff) | |
download | mariadb-git-ffe83e8e7bef32eb2a80aad2d382f0b023dd3a44.tar.gz |
MDEV-16351 JSON_OBJECT() treats hybrid functions with boolean arguments as numbers
Now the boolean data type is preserved in hybrid functions and MIN/MAX,
so COALESCE(bool_expr,bool_expr) and MAX(bool_expr) are correctly
detected by JSON_OBJECT() as being boolean rather than numeric expressions.
Diffstat (limited to 'sql/field.cc')
-rw-r--r-- | sql/field.cc | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/sql/field.cc b/sql/field.cc index 059b06b5dba..4f04fef1a26 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -917,6 +917,27 @@ const Type_handler * Type_handler::aggregate_for_result_traditional(const Type_handler *a, const Type_handler *b) { + if (a == b) + { + /* + If two traditional handlers are equal, quickly return "a". + Some handlers (e.g. Type_handler_bool) pretend to be traditional, + but in fact they are not traditional in full extent, they are + only sub-types for now (and don't have a corresponding Field_xxx yet). + Here we preserve such handlers during aggregation. + As a result, COALESCE(true,true) preserves the "boolean" data type. + + Need to do this conversion for deprecated data types, + similar to what field_type_merge_rules[][] does. + */ + switch (a->field_type()) { + case MYSQL_TYPE_DECIMAL: return &type_handler_newdecimal; + case MYSQL_TYPE_DATE: return &type_handler_newdate; + case MYSQL_TYPE_VAR_STRING: return &type_handler_varchar; + default: break; + } + return a; + } enum_field_types ta= a->traditional_merge_field_type(); enum_field_types tb= b->traditional_merge_field_type(); enum_field_types res= field_types_merge_rules[merge_type2index(ta)] |