mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-12655 Move Item_func::count_xxx_length() to Type_std_attributes
This commit is contained in:
128
sql/sql_type.h
128
sql/sql_type.h
@ -60,7 +60,6 @@ class Item_func_div;
|
||||
class Item_func_mod;
|
||||
class cmp_item;
|
||||
class in_vector;
|
||||
class Type_std_attributes;
|
||||
class Sort_param;
|
||||
class Arg_comparator;
|
||||
struct st_value;
|
||||
@ -327,6 +326,133 @@ public:
|
||||
{
|
||||
fix_attributes_temporal(MAX_DATETIME_WIDTH, dec);
|
||||
}
|
||||
|
||||
void count_only_length(Item **item, uint nitems);
|
||||
void count_octet_length(Item **item, uint nitems);
|
||||
void count_real_length(Item **item, uint nitems);
|
||||
void count_decimal_length(Item **item, uint nitems);
|
||||
bool count_string_length(const char *func_name, Item **item, uint nitems);
|
||||
uint count_max_decimals(Item **item, uint nitems);
|
||||
|
||||
void aggregate_attributes_int(Item **items, uint nitems)
|
||||
{
|
||||
collation.set_numeric();
|
||||
count_only_length(items, nitems);
|
||||
decimals= 0;
|
||||
}
|
||||
void aggregate_attributes_real(Item **items, uint nitems)
|
||||
{
|
||||
collation.set_numeric();
|
||||
count_real_length(items, nitems);
|
||||
}
|
||||
void aggregate_attributes_decimal(Item **items, uint nitems)
|
||||
{
|
||||
collation.set_numeric();
|
||||
count_decimal_length(items, nitems);
|
||||
}
|
||||
bool aggregate_attributes_string(const char *func_name,
|
||||
Item **item, uint nitems)
|
||||
{
|
||||
return count_string_length(func_name, item, nitems);
|
||||
}
|
||||
void aggregate_attributes_temporal(uint int_part_length,
|
||||
Item **item, uint nitems)
|
||||
{
|
||||
fix_attributes_temporal(int_part_length, count_max_decimals(item, nitems));
|
||||
}
|
||||
|
||||
bool agg_item_collations(DTCollation &c, const char *name,
|
||||
Item **items, uint nitems,
|
||||
uint flags, int item_sep);
|
||||
bool agg_item_set_converter(const DTCollation &coll, const char *fname,
|
||||
Item **args, uint nargs,
|
||||
uint flags, int item_sep);
|
||||
|
||||
/*
|
||||
Collect arguments' character sets together.
|
||||
We allow to apply automatic character set conversion in some cases.
|
||||
The conditions when conversion is possible are:
|
||||
- arguments A and B have different charsets
|
||||
- A wins according to coercibility rules
|
||||
(i.e. a column is stronger than a string constant,
|
||||
an explicit COLLATE clause is stronger than a column)
|
||||
- character set of A is either superset for character set of B,
|
||||
or B is a string constant which can be converted into the
|
||||
character set of A without data loss.
|
||||
|
||||
If all of the above is true, then it's possible to convert
|
||||
B into the character set of A, and then compare according
|
||||
to the collation of A.
|
||||
|
||||
For functions with more than two arguments:
|
||||
|
||||
collect(A,B,C) ::= collect(collect(A,B),C)
|
||||
|
||||
Since this function calls THD::change_item_tree() on the passed Item **
|
||||
pointers, it is necessary to pass the original Item **'s, not copies.
|
||||
Otherwise their values will not be properly restored (see BUG#20769).
|
||||
If the items are not consecutive (eg. args[2] and args[5]), use the
|
||||
item_sep argument, ie.
|
||||
|
||||
agg_item_charsets(coll, fname, &args[2], 2, flags, 3)
|
||||
*/
|
||||
bool agg_arg_charsets(DTCollation &c, const char *func_name,
|
||||
Item **items, uint nitems,
|
||||
uint flags, int item_sep)
|
||||
{
|
||||
if (agg_item_collations(c, func_name, items, nitems, flags, item_sep))
|
||||
return true;
|
||||
return agg_item_set_converter(c, func_name, items, nitems, flags, item_sep);
|
||||
}
|
||||
/*
|
||||
Aggregate arguments for string result, e.g: CONCAT(a,b)
|
||||
- convert to @@character_set_connection if all arguments are numbers
|
||||
- allow DERIVATION_NONE
|
||||
*/
|
||||
bool agg_arg_charsets_for_string_result(DTCollation &c, const char *func_name,
|
||||
Item **items, uint nitems,
|
||||
int item_sep)
|
||||
{
|
||||
uint flags= MY_COLL_ALLOW_SUPERSET_CONV |
|
||||
MY_COLL_ALLOW_COERCIBLE_CONV |
|
||||
MY_COLL_ALLOW_NUMERIC_CONV;
|
||||
return agg_arg_charsets(c, func_name, items, nitems, flags, item_sep);
|
||||
}
|
||||
/*
|
||||
Aggregate arguments for string result, when some comparison
|
||||
is involved internally, e.g: REPLACE(a,b,c)
|
||||
- convert to @@character_set_connection if all arguments are numbers
|
||||
- disallow DERIVATION_NONE
|
||||
*/
|
||||
bool agg_arg_charsets_for_string_result_with_comparison(DTCollation &c,
|
||||
const char *func_name,
|
||||
Item **items,
|
||||
uint nitems,
|
||||
int item_sep)
|
||||
{
|
||||
uint flags= MY_COLL_ALLOW_SUPERSET_CONV |
|
||||
MY_COLL_ALLOW_COERCIBLE_CONV |
|
||||
MY_COLL_ALLOW_NUMERIC_CONV |
|
||||
MY_COLL_DISALLOW_NONE;
|
||||
return agg_arg_charsets(c, func_name, items, nitems, flags, item_sep);
|
||||
}
|
||||
|
||||
/*
|
||||
Aggregate arguments for comparison, e.g: a=b, a LIKE b, a RLIKE b
|
||||
- don't convert to @@character_set_connection if all arguments are numbers
|
||||
- don't allow DERIVATION_NONE
|
||||
*/
|
||||
bool agg_arg_charsets_for_comparison(DTCollation &c,
|
||||
const char *func_name,
|
||||
Item **items, uint nitems,
|
||||
int item_sep)
|
||||
{
|
||||
uint flags= MY_COLL_ALLOW_SUPERSET_CONV |
|
||||
MY_COLL_ALLOW_COERCIBLE_CONV |
|
||||
MY_COLL_DISALLOW_NONE;
|
||||
return agg_arg_charsets(c, func_name, items, nitems, flags, item_sep);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user