Commit c86f813a authored by Alexander Barkov's avatar Alexander Barkov Committed by Nikita Malyavin

MDEV-9234 Add Type_handler::union_element_finalize()

parent 9d5967f7
...@@ -5933,6 +5933,18 @@ void Type_handler_geometry::Item_param_set_param_func(Item_param *param, ...@@ -5933,6 +5933,18 @@ void Type_handler_geometry::Item_param_set_param_func(Item_param *param,
/***************************************************************************/ /***************************************************************************/
bool Type_handler_string_result::union_element_finalize(const Item * item) const
{
if (item->collation.derivation == DERIVATION_NONE)
{
my_error(ER_CANT_AGGREGATE_NCOLLATIONS, MYF(0), "UNION");
return true;
}
return false;
}
/***************************************************************************/
bool Type_handler::Vers_history_point_resolve_unit(THD *thd, bool Type_handler::Vers_history_point_resolve_unit(THD *thd,
Vers_history_point *point) Vers_history_point *point)
const const
......
...@@ -1187,6 +1187,14 @@ class Type_handler ...@@ -1187,6 +1187,14 @@ class Type_handler
virtual Field *make_conversion_table_field(TABLE *TABLE, virtual Field *make_conversion_table_field(TABLE *TABLE,
uint metadata, uint metadata,
const Field *target) const= 0; const Field *target) const= 0;
/*
Performs the final data type validation for a UNION element,
after the regular "aggregation for result" was done.
*/
virtual bool union_element_finalize(const Item * item) const
{
return false;
}
virtual bool Column_definition_fix_attributes(Column_definition *c) const= 0; virtual bool Column_definition_fix_attributes(Column_definition *c) const= 0;
virtual bool Column_definition_prepare_stage1(THD *thd, virtual bool Column_definition_prepare_stage1(THD *thd,
MEM_ROOT *mem_root, MEM_ROOT *mem_root,
...@@ -2236,7 +2244,7 @@ class Type_handler_string_result: public Type_handler ...@@ -2236,7 +2244,7 @@ class Type_handler_string_result: public Type_handler
void sortlength(THD *thd, void sortlength(THD *thd,
const Type_std_attributes *item, const Type_std_attributes *item,
SORT_FIELD_ATTR *attr) const; SORT_FIELD_ATTR *attr) const;
bool union_element_finalize(const Item * item) const;
bool Column_definition_prepare_stage1(THD *thd, bool Column_definition_prepare_stage1(THD *thd,
MEM_ROOT *mem_root, MEM_ROOT *mem_root,
Column_definition *c, Column_definition *c,
......
...@@ -1150,12 +1150,12 @@ bool st_select_lex_unit::prepare(TABLE_LIST *derived_arg, ...@@ -1150,12 +1150,12 @@ bool st_select_lex_unit::prepare(TABLE_LIST *derived_arg,
while ((type= tp++)) while ((type= tp++))
{ {
if (type->cmp_type() == STRING_RESULT && /*
type->collation.derivation == DERIVATION_NONE) Test if the aggregated data type is OK for a UNION element.
{ E.g. in case of string data, DERIVATION_NONE is not allowed.
my_error(ER_CANT_AGGREGATE_NCOLLATIONS, MYF(0), "UNION"); */
if (type->type_handler()->union_element_finalize(type))
goto err; goto err;
}
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment