summaryrefslogtreecommitdiff
path: root/sql/field.cc
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.com>2018-05-31 18:52:32 +0400
committerAlexander Barkov <bar@mariadb.com>2018-05-31 18:52:32 +0400
commitffe83e8e7bef32eb2a80aad2d382f0b023dd3a44 (patch)
tree065bfa8c2afb2dcb2096e40d18c2e56a61eae47f /sql/field.cc
parent3ceb4a54a178d3e92529b4be16e866e18fd15218 (diff)
downloadmariadb-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.cc21
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)]