1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

MDEV-9234 Add Type_handler::union_element_finalize()

This commit is contained in:
Alexander Barkov
2019-04-23 13:45:28 +04:00
parent a765b19e5c
commit baadbe9601
3 changed files with 27 additions and 5 deletions

View File

@ -7890,6 +7890,19 @@ bool Type_handler_string_result::Item_eq_value(THD *thd,
}
/***************************************************************************/
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;
}
/***************************************************************************/
void Type_handler_var_string::

View File

@ -3356,6 +3356,14 @@ public:
virtual Field *make_conversion_table_field(TABLE *TABLE,
uint metadata,
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;
}
// Automatic upgrade, e.g. for ALTER TABLE t1 FORCE
virtual void Column_definition_implicit_upgrade(Column_definition *c) const
{ }
@ -4580,6 +4588,7 @@ public:
void sortlength(THD *thd,
const Type_std_attributes *item,
SORT_FIELD_ATTR *attr) const;
bool union_element_finalize(const Item * item) const;
bool Column_definition_prepare_stage1(THD *thd,
MEM_ROOT *mem_root,
Column_definition *c,

View File

@ -1085,13 +1085,13 @@ cont:
while ((type= tp++))
{
if (type->cmp_type() == STRING_RESULT &&
type->collation.derivation == DERIVATION_NONE)
{
my_error(ER_CANT_AGGREGATE_NCOLLATIONS, MYF(0), "UNION");
/*
Test if the aggregated data type is OK for a UNION element.
E.g. in case of string data, DERIVATION_NONE is not allowed.
*/
if (type->type_handler()->union_element_finalize(type))
goto err;
}
}
/*
Disable the usage of fulltext searches in the last union branch.