MySQL 8.4.2
Source Code Documentation
|
Class Item_sum is the base class used for special expressions that SQL calls 'set functions'. More...
#include <item_sum.h>
Classes | |
struct | Collect_grouped_aggregate_info |
argument used by walk method collect_grouped_aggregates ("cga") More... | |
Public Member Functions | |
bool | has_force_copy_fields () const |
bool | has_with_distinct () const |
void | mark_as_sum_func () |
void | mark_as_sum_func (Query_block *) |
Item_sum (const POS &pos, PT_window *w) | |
Item_sum (Item *a) | |
Item_sum (const POS &pos, Item *a, PT_window *w) | |
Item_sum (const POS &pos, Item *a, Item *b, PT_window *w) | |
Item_sum (const POS &pos, PT_item_list *opt_list, PT_window *w) | |
Item_sum (THD *thd, const Item_sum *item) | |
Copy constructor, need to perform subqueries with temporary tables. More... | |
bool | do_itemize (Parse_context *pc, Item **res) override |
The core function that does the actual itemization. More... | |
Type | type () const override |
virtual enum Sumfunctype | sum_func () const =0 |
virtual enum Sumfunctype | real_sum_func () const |
bool | reset_and_add () |
Resets the aggregate value to its default and aggregates the current value of its attribute(s). More... | |
virtual void | reset_field ()=0 |
virtual void | update_field ()=0 |
virtual bool | keep_field_type () const |
bool | resolve_type (THD *) override |
Resolve type-related information for this item, such as result field type, maximum size, precision, signedness, character set and collation. More... | |
virtual Item * | result_item (Field *field) |
table_map | used_tables () const override |
table_map | not_null_tables () const override |
Return table map of tables that can't be NULL tables (tables that are used in a context where if they would contain a NULL row generated by a LEFT or RIGHT join, the item would not be true). More... | |
void | update_used_tables () override |
Updates used tables, not null tables information and accumulates properties up the item tree, cf. More... | |
void | fix_after_pullout (Query_block *parent_query_block, Query_block *removed_query_block) override |
Fix after tables have been moved from one query_block level to the parent level, e.g by semijoin conversion. More... | |
void | add_used_tables_for_aggr_func () |
Add used_tables information for aggregate function, based on its aggregated query block. More... | |
bool | is_null () override |
The method allows to determine nullness of a complex expression without fully evaluating it, instead of calling val*() then checking null_value. More... | |
void | make_const () |
void | print (const THD *thd, String *str, enum_query_type query_type) const override |
This method is used for to: More... | |
bool | eq (const Item *item, bool binary_cmp) const override |
void | no_rows_in_result () override |
Mark an aggregate as having no rows. More... | |
virtual void | make_unique () |
virtual Field * | create_tmp_field (bool group, TABLE *table) |
bool | collect_grouped_aggregates (uchar *) override |
Item * | replace_aggregate (uchar *) override |
bool | collect_scalar_subqueries (uchar *) override |
bool | collect_item_field_or_view_ref_processor (uchar *) override |
Collects fields and view references that have the qualifying table in the specified query block. More... | |
bool | clean_up_after_removal (uchar *arg) override |
Remove the item from the list of inner aggregation functions in the Query_block it was moved to by Item_sum::check_sum_func(). More... | |
bool | aggregate_check_group (uchar *arg) override |
bool | aggregate_check_distinct (uchar *arg) override |
bool | has_aggregate_ref_in_group_by (uchar *arg) override |
Check if an aggregate is referenced from within the GROUP BY clause of the query block in which it is aggregated. More... | |
bool | init_sum_func_check (THD *thd) |
Prepare an aggregate function for checking of context. More... | |
bool | check_sum_func (THD *thd, Item **ref) |
Validate the semantic requirements of a set function. More... | |
Item * | set_arg (THD *thd, uint i, Item *new_val) override |
Item ** | get_arg_ptr (uint i) |
bool | fix_fields (THD *thd, Item **ref) override |
virtual void | update_after_wf_arguments_changed (THD *) |
Signal to the function that its arguments may have changed, and that any internal caches etc. More... | |
virtual bool | aggregator_setup (THD *thd) |
Called to initialize the aggregator. More... | |
void | aggregator_clear () |
Called to cleanup the aggregator. More... | |
bool | aggregator_add () |
Called to add value to the aggregator. More... | |
void | set_distinct (bool distinct) |
virtual int | set_aggregator (Aggregator::Aggregator_type aggregator) |
virtual void | clear ()=0 |
virtual bool | add ()=0 |
virtual bool | setup (THD *) |
virtual bool | check_wf_semantics1 (THD *thd, Query_block *select, Window_evaluation_requirements *reqs) |
Only relevant for aggregates qua window functions. More... | |
virtual bool | check_wf_semantics2 (Window_evaluation_requirements *reqs) |
Like check_wf_semantics1. More... | |
bool | split_sum_func (THD *thd, Ref_item_array ref_item_array, mem_root_deque< Item * > *fields) override |
See comments in Item_cmp_func::split_sum_func() More... | |
void | cleanup () override |
Called for every Item after use (preparation and execution). More... | |
Window * | window () |
const Window * | window () const |
bool | reset_wf_state (uchar *arg) override |
Reset execution state for such window function types as determined by arg. More... | |
virtual bool | framing () const |
All aggregates are framing, i.e. More... | |
virtual bool | uses_only_one_row () const |
Only for framing window functions. More... | |
virtual bool | needs_partition_cardinality () const |
Return true if we need to make two passes over the rows in the partition - either because we need the cardinality of it (and we need to read all rows to detect the next partition), or we need to have all partition rows available to evaluate the window function for some other reason, e.g. More... | |
bool | wf_common_init () |
Common initial actions for window functions. More... | |
virtual bool | is_rollup_sum_wrapper () const |
Overridden by Item_rollup_sum_switcher. More... | |
virtual const Item_sum * | unwrap_sum () const |
In case we are an Item_rollup_sum_switcher, return the underlying Item_sum, otherwise, return this. More... | |
virtual Item_sum * | unwrap_sum () |
Non-const version. More... | |
Public Member Functions inherited from Item_func | |
virtual uint | argument_count () const |
Item ** | arguments () const |
bool | is_null_on_null () const |
virtual enum Functype | functype () const |
Item_func () | |
Item_func (const POS &pos) | |
Item_func (Item *a) | |
Item_func (const POS &pos, Item *a) | |
Item_func (Item *a, Item *b) | |
Item_func (const POS &pos, Item *a, Item *b) | |
Item_func (Item *a, Item *b, Item *c) | |
Item_func (const POS &pos, Item *a, Item *b, Item *c) | |
Item_func (Item *a, Item *b, Item *c, Item *d) | |
Item_func (const POS &pos, Item *a, Item *b, Item *c, Item *d) | |
Item_func (Item *a, Item *b, Item *c, Item *d, Item *e) | |
Item_func (const POS &pos, Item *a, Item *b, Item *c, Item *d, Item *e) | |
Item_func (Item *a, Item *b, Item *c, Item *d, Item *e, Item *f) | |
Item_func (const POS &pos, Item *a, Item *b, Item *c, Item *d, Item *e, Item *f) | |
Item_func (mem_root_deque< Item * > *list) | |
Item_func (const POS &pos, PT_item_list *opt_list) | |
Item_func (THD *thd, const Item_func *item) | |
virtual Item * | get_arg (uint i) |
Get the i'th argument of the function that this object represents. More... | |
virtual const Item * | get_arg (uint i) const |
Get the i'th argument of the function that this object represents. More... | |
bool | fix_func_arg (THD *, Item **arg) |
virtual bool | resolve_type_inner (THD *) |
Resolve type of function after all arguments have had their data types resolved. More... | |
bool | propagate_type (THD *thd, const Type_properties &type) override |
Default implementation for all functions: Propagate base_item's type into all arguments. More... | |
virtual table_map | get_initial_pseudo_tables () const |
Returns the pseudo tables depended upon in order to evaluate this function expression. More... | |
void | set_used_tables (table_map map) |
virtual optimize_type | select_optimize (const THD *) |
virtual bool | have_rev_func () const |
virtual Item * | key_item () const |
bool | set_arguments (mem_root_deque< Item * > *list, bool context_free) |
Copy arguments from list to args array. More... | |
void | print_op (const THD *thd, String *str, enum_query_type query_type) const |
void | print_args (const THD *thd, String *str, uint from, enum_query_type query_type) const |
virtual void | fix_num_length_and_dec () |
virtual bool | is_deprecated () const |
bool | get_arg0_date (MYSQL_TIME *ltime, my_time_flags_t fuzzy_date) |
bool | get_arg0_time (MYSQL_TIME *ltime) |
void | signal_divide_by_null () |
void | signal_invalid_argument_for_log () |
Field * | tmp_table_field (TABLE *t_arg) override |
Item * | get_tmp_table_item (THD *thd) override |
If an Item is materialized in a temporary table, a different Item may have to be used in the part of the query that runs after the materialization. More... | |
my_decimal * | val_decimal (my_decimal *) override |
bool | agg_arg_charsets (DTCollation &c, Item **items, uint nitems, uint flags, int item_sep) |
bool | agg_arg_charsets_for_string_result (DTCollation &c, Item **items, uint nitems, int item_sep=1) |
bool | agg_arg_charsets_for_comparison (DTCollation &c, Item **items, uint nitems, int item_sep=1) |
Item * | replace_func_call (uchar *) override |
bool | walk (Item_processor processor, enum_walk walk, uchar *arg) override |
Traverses a tree of Items in prefix and/or postfix order. More... | |
Item * | transform (Item_transformer transformer, uchar *arg) override |
Transform an Item_func object with a transformer callback function. More... | |
Item * | compile (Item_analyzer analyzer, uchar **arg_p, Item_transformer transformer, uchar *arg_t) override |
Compile Item_func object with a processor and a transformer callback functions. More... | |
void | traverse_cond (Cond_traverser traverser, void *arg, traverse_order order) override |
bool | replace_equal_field_checker (uchar **arg) override |
Item * | replace_equal_field (uchar *arg) override |
virtual bool | allow_replacement (Item_field *const original, Item *const subst) |
Check whether a function allows replacement of a field with another item: In particular, a replacement that changes the metadata of some Item from non-nullable to nullable is not allowed. More... | |
double | check_float_overflow (double value) |
Throw an error if the input double number is not finite, i.e. More... | |
longlong | check_integer_overflow (longlong value, bool val_unsigned) |
Throw an error if the input BIGINT value represented by the (longlong value, bool unsigned flag) pair cannot be returned by the function, i.e. More... | |
int | check_decimal_overflow (int error) |
Throw an error if the error code of a DECIMAL operation is E_DEC_OVERFLOW. More... | |
bool | has_timestamp_args () |
bool | has_date_args () |
bool | has_time_args () |
bool | has_datetime_args () |
bool | check_valid_arguments_processor (uchar *) override |
Item * | gc_subst_transformer (uchar *arg) override |
Transformer function for GC substitution. More... | |
virtual enum_const_item_cache | can_cache_json_arg (Item *arg) |
Whether an arg of a JSON function can be cached to avoid repetitive string->JSON conversion. More... | |
virtual bool | contains_only_equi_join_condition () const |
Whether this Item is an equi-join condition. More... | |
Public Member Functions inherited from Item_result_field | |
Item_result_field ()=default | |
Item_result_field (const POS &pos) | |
Item_result_field (THD *thd, const Item_result_field *item) | |
Field * | get_tmp_table_field () override |
If this Item is being materialized into a temporary table, returns the field that is being materialized into. More... | |
void | set_result_field (Field *field) override |
bool | is_result_field () const override |
Field * | get_result_field () const override |
virtual const char * | func_name () const =0 |
bool | mark_field_in_map (uchar *arg) override |
Mark underlying field in read or write map of a table. More... | |
longlong | llrint_with_overflow_check (double realval) |
void | raise_numeric_overflow (const char *type_name) |
double | raise_float_overflow () |
longlong | raise_integer_overflow () |
int | raise_decimal_overflow () |
Public Member Functions inherited from Item | |
Item (const Item &)=delete | |
void | operator= (Item &)=delete |
Item () | |
Item constructor for general use. More... | |
Item (THD *thd, const Item *item) | |
Constructor used by Item_field, Item_ref & aggregate functions. More... | |
Item (const POS &) | |
Parse-time context-independent constructor. More... | |
~Item () override=default | |
virtual bool | itemize (Parse_context *pc, Item **res) final |
The same as contextualize() but with additional parameter. More... | |
void | rename (char *new_name) |
rename item (used for views, cleanup() return original name). More... | |
void | init_make_field (Send_field *tmp_field, enum enum_field_types type) |
virtual void | notify_removal () |
Called when an item has been removed, can be used to notify external objects about the removal, e.g subquery predicates that are part of the sj_candidates container. More... | |
virtual void | make_field (Send_field *field) |
virtual Field * | make_string_field (TABLE *table) const |
Create a field to hold a string value from an item. More... | |
void | quick_fix_field () |
virtual void | set_can_use_prefix_key () |
bool | propagate_type (THD *thd, enum_field_types def=MYSQL_TYPE_VARCHAR, bool pin=false, bool inherit=false) |
Wrapper for easier calling of propagate_type(const Type_properties &). More... | |
virtual void | mark_json_as_scalar () |
For Items with data type JSON, mark that a string argument is treated as a scalar JSON value. More... | |
virtual std::optional< ContainedSubquery > | get_contained_subquery (const Query_block *outer_query_block) |
If this item represents a IN/ALL/ANY/comparison_operator subquery, return that (along with data on how it will be executed). More... | |
type_conversion_status | save_in_field_no_warnings (Field *field, bool no_conversions) |
Save the item into a field but do not emit any warnings. More... | |
type_conversion_status | save_in_field (Field *field, bool no_conversions) |
Save a temporal value in packed longlong format into a Field. More... | |
void | save_in_field_no_error_check (Field *field, bool no_conversions) |
A slightly faster value of save_in_field() that returns no error value (you will need to check thd->is_error() yourself), and does not support saving into hidden fields for functional indexes. More... | |
virtual void | save_org_in_field (Field *field) |
virtual bool | send (Protocol *protocol, String *str) |
This is only called from items that is not of type item_field. More... | |
bool | evaluate (THD *thd, String *str) |
Evaluate scalar item, possibly using the supplied buffer. More... | |
virtual Item_result | result_type () const |
virtual Item_result | numeric_context_result_type () const |
Result type when an item appear in a numeric context. More... | |
Item_result | temporal_with_date_as_number_result_type () const |
Similar to result_type() but makes DATE, DATETIME, TIMESTAMP pretend to be numbers rather than strings. More... | |
virtual void | set_data_type_inherited () |
Set data type for item as inherited. More... | |
virtual void | pin_data_type () |
Pin the data type for the item. More... | |
enum_field_types | data_type () const |
Retrieve the derived data type of the Item. More... | |
virtual enum_field_types | actual_data_type () const |
Retrieve actual data type for an item. More... | |
virtual enum_field_types | default_data_type () const |
Get the default data (output) type for the specific item. More... | |
void | set_data_type (enum_field_types data_type) |
Set the data type of the current Item. More... | |
void | set_data_type_null () |
void | set_data_type_bool () |
void | set_data_type_int (enum_field_types type, bool unsigned_prop, uint32 max_width) |
Set the data type of the Item to be a specific integer type. More... | |
void | set_data_type_longlong () |
Set the data type of the Item to be longlong. More... | |
void | set_data_type_decimal (uint8 precision, uint8 scale) |
Set the data type of the Item to be decimal. More... | |
void | set_data_type_double () |
Set the data type of the Item to be double precision floating point. More... | |
void | set_data_type_float () |
Set the data type of the Item to be single precision floating point. More... | |
void | set_data_type_string (uint32 max_l) |
Set the Item to be variable length string. More... | |
void | set_data_type_string (ulonglong max_char_length_arg) |
Set the Item to be variable length string. More... | |
void | set_data_type_string (uint32 max_l, const CHARSET_INFO *cs) |
Set the Item to be variable length string. More... | |
void | set_data_type_string (uint32 max_l, const DTCollation &coll) |
Set the Item to be variable length string. More... | |
void | set_data_type_char (uint32 max_l) |
Set the Item to be fixed length string. More... | |
void | set_data_type_char (uint32 max_l, const CHARSET_INFO *cs) |
Set the Item to be fixed length string. More... | |
void | set_data_type_blob (enum_field_types type, uint32 max_l) |
Set the Item to be of BLOB type. More... | |
void | set_data_type_date () |
Set all type properties for Item of DATE type. More... | |
void | set_data_type_time (uint8 fsp) |
Set all type properties for Item of TIME type. More... | |
void | set_data_type_datetime (uint8 fsp) |
Set all properties for Item of DATETIME type. More... | |
void | set_data_type_timestamp (uint8 fsp) |
Set all properties for Item of TIMESTAMP type. More... | |
void | set_data_type_geometry () |
Set the data type of the Item to be GEOMETRY. More... | |
void | set_data_type_json () |
Set the data type of the Item to be JSON. More... | |
void | set_data_type_year () |
Set the data type of the Item to be YEAR. More... | |
void | set_data_type_bit (uint32 max_bits) |
Set the data type of the Item to be bit. More... | |
void | set_data_type_from_item (const Item *item) |
Set data type properties of the item from the properties of another item. More... | |
virtual TYPELIB * | get_typelib () const |
Get the typelib information for an item of type set or enum. More... | |
virtual Item_result | cast_to_int_type () const |
bool | aggregate_type (const char *name, Item **items, uint count) |
Aggregates data types from array of items into current item. More... | |
virtual enum_monotonicity_info | get_monotonicity_info () const |
virtual longlong | val_int_endpoint (bool left_endp, bool *incl_endp) |
virtual double | val_real ()=0 |
virtual longlong | val_int ()=0 |
virtual longlong | val_date_temporal () |
Return date value of item in packed longlong format. More... | |
virtual longlong | val_time_temporal () |
Return time value of item in packed longlong format. More... | |
longlong | val_temporal_by_field_type () |
Return date or time value of item in packed longlong format, depending on item field type. More... | |
longlong | int_sort_key () |
Produces a key suitable for filesort. More... | |
longlong | val_temporal_with_round (enum_field_types type, uint8 dec) |
Get date or time value in packed longlong format. More... | |
ulonglong | val_uint () |
virtual String * | val_str (String *str)=0 |
virtual String * | val_str_ascii (String *str) |
virtual bool | val_bool () |
virtual bool | val_json (Json_wrapper *result) |
Get a JSON value from an Item. More... | |
virtual float | get_filtering_effect (THD *thd, table_map filter_for_table, table_map read_tables, const MY_BITMAP *fields_to_ignore, double rows_in_table) |
Calculate the filter contribution that is relevant for table 'filter_for_table' for this item. More... | |
bool | error_json () |
Get the value to return from val_json() in case of errors. More... | |
bool | get_date_from_non_temporal (MYSQL_TIME *ltime, my_time_flags_t fuzzydate) |
Convert a non-temporal type to date. More... | |
bool | get_time_from_non_temporal (MYSQL_TIME *ltime) |
Convert a non-temporal type to time. More... | |
my_decimal * | error_decimal (my_decimal *decimal_value) |
Get the value to return from val_decimal() in case of errors. More... | |
String * | error_str () |
Get the value to return from val_str() in case of errors. More... | |
type_conversion_status | save_time_in_field (Field *field) |
type_conversion_status | save_date_in_field (Field *field) |
type_conversion_status | save_str_value_in_field (Field *field, String *result) |
virtual const char * | full_name () const |
virtual bool | basic_const_item () const |
Returns true if this is a simple constant item like an integer, not a constant expression. More... | |
bool | may_eval_const_item (const THD *thd) const |
virtual Item * | clone_item () const |
virtual cond_result | eq_cmp_result () const |
uint | float_length (uint decimals_par) const |
virtual uint | decimal_precision () const |
int | decimal_int_part () const |
virtual uint | time_precision () |
TIME precision of the item: 0..6. More... | |
virtual uint | datetime_precision () |
DATETIME precision of the item: 0..6. More... | |
bool | const_item () const |
Returns true if item is constant, regardless of query evaluation state. More... | |
bool | const_for_execution () const |
Returns true if item is constant during one query execution. More... | |
bool | may_evaluate_const (const THD *thd) const |
Return true if this is a const item that may be evaluated in the current phase of statement processing. More... | |
bool | is_non_deterministic () const |
bool | is_outer_reference () const |
void | print_item_w_name (const THD *thd, String *, enum_query_type query_type) const |
void | print_for_order (const THD *thd, String *str, enum_query_type query_type, const char *used_alias) const |
Prints the item when it's part of ORDER BY and GROUP BY. More... | |
bool | split_sum_func2 (THD *thd, Ref_item_array ref_item_array, mem_root_deque< Item * > *fields, Item **ref, bool skip_registered) |
virtual bool | get_date (MYSQL_TIME *ltime, my_time_flags_t fuzzydate)=0 |
virtual bool | get_time (MYSQL_TIME *ltime)=0 |
virtual bool | get_timeval (my_timeval *tm, int *warnings) |
Get timestamp in "struct timeval" format. More... | |
bool | update_null_value () |
Make sure the null_value member has a correct value. More... | |
virtual void | apply_is_true () |
Apply the IS TRUE truth property, meaning that an UNKNOWN result and a FALSE result are treated the same. More... | |
virtual bool | is_bool_func () const |
virtual Item * | copy_or_same (THD *) |
virtual Item * | copy_andor_structure (THD *) |
virtual Item * | real_item () |
virtual const Item * | real_item () const |
virtual const CHARSET_INFO * | compare_collation () const |
virtual const CHARSET_INFO * | charset_for_protocol () |
template<class T > | |
auto | walk_helper_thunk (uchar *arg) |
template<class T > | |
auto | analyze_helper_thunk (uchar **arg) |
See CompileItem. More... | |
virtual bool | intro_version (uchar *) |
bool | cleanup_processor (uchar *) |
cleanup() item if it is resolved ('fixed'). More... | |
virtual bool | collect_item_field_processor (uchar *) |
virtual bool | collect_item_field_or_ref_processor (uchar *) |
virtual bool | add_field_to_set_processor (uchar *) |
Item::walk function. More... | |
virtual bool | visitor_processor (uchar *arg) |
A processor to handle the select lex visitor framework. More... | |
virtual bool | add_field_to_cond_set_processor (uchar *) |
Item::walk function. More... | |
virtual bool | remove_column_from_bitmap (uchar *arg) |
Visitor interface for removing all column expressions (Item_field) in this expression tree from a bitmap. More... | |
virtual bool | find_item_in_field_list_processor (uchar *) |
virtual bool | change_context_processor (uchar *) |
virtual bool | find_item_processor (uchar *arg) |
virtual bool | find_field_processor (uchar *) |
Is this an Item_field which references the given Field argument? More... | |
virtual bool | cast_incompatible_args (uchar *) |
Wrap incompatible arguments in CAST nodes to the expected data types. More... | |
virtual bool | used_tables_for_level (uchar *arg) |
Return used table information for the specified query block (level). More... | |
virtual bool | check_column_privileges (uchar *thd) |
Check privileges. More... | |
virtual bool | inform_item_in_cond_of_tab (uchar *) |
virtual void | bind_fields () |
Bind objects from the current execution context to field objects in item trees. More... | |
virtual bool | is_strong_side_column_not_in_fd (uchar *) |
virtual bool | is_column_not_in_fd (uchar *) |
virtual Bool3 | local_column (const Query_block *) const |
virtual bool | collect_subqueries (uchar *) |
virtual bool | update_depended_from (uchar *) |
bool | visit_all_analyzer (uchar **) |
virtual bool | cache_const_expr_analyzer (uchar **cache_item) |
Check if an item is a constant one and can be cached. More... | |
Item * | cache_const_expr_transformer (uchar *item) |
Cache item if needed. More... | |
virtual bool | equality_substitution_analyzer (uchar **) |
virtual Item * | equality_substitution_transformer (uchar *) |
virtual bool | check_partition_func_processor (uchar *) |
Check if a partition function is allowed. More... | |
virtual bool | subst_argument_checker (uchar **arg) |
virtual bool | explain_subquery_checker (uchar **) |
virtual Item * | explain_subquery_propagator (uchar *) |
virtual Item * | equal_fields_propagator (uchar *) |
virtual bool | disable_constant_propagation (uchar *) |
virtual bool | check_gcol_depend_default_processor (uchar *args) |
Check if a generated expression depends on DEFAULT function with specific column name as argument. More... | |
virtual Item * | replace_with_derived_expr (uchar *arg) |
Assuming this expression is part of a condition that would be pushed to the WHERE clause of a materialized derived table, replace, in this expression, each derived table's column with a clone of the expression lying under it in the derived table's definition. More... | |
virtual Item * | replace_with_derived_expr_ref (uchar *arg) |
Assuming this expression is part of a condition that would be pushed to the HAVING clause of a materialized derived table, replace, in this expression, each derived table's column with a reference to the expression lying under it in the derived table's definition. More... | |
virtual Item * | replace_view_refs_with_clone (uchar *arg) |
Assuming this expression is part of a condition that would be pushed to a materialized derived table, replace, in this expression, each view reference with a clone of the expression in merged derived table's definition. More... | |
virtual Item * | this_item () |
virtual const Item * | this_item () const |
virtual Item ** | this_item_addr (THD *, Item **addr_arg) |
virtual uint | cols () const |
virtual Item * | element_index (uint) |
virtual Item ** | addr (uint) |
virtual bool | check_cols (uint c) |
virtual bool | null_inside () |
virtual void | bring_value () |
Field * | tmp_table_field_from_field_type (TABLE *table, bool fixed_length) const |
Create a field based on field_type of argument. More... | |
virtual Item_field * | field_for_view_update () |
virtual Item * | truth_transformer (THD *thd, Bool_test test) |
Informs an item that it is wrapped in a truth test, in case it wants to transforms itself to implement this test by itself. More... | |
virtual Item * | update_value_transformer (uchar *) |
virtual Item * | replace_scalar_subquery (uchar *) |
When walking the item tree seeing an Item_singlerow_subselect matching a target, replace it with a substitute field used when transforming scalar subqueries into derived tables. More... | |
virtual Item * | replace_item_field (uchar *) |
Transform processor used by Query_block::transform_grouped_to_derived to replace fields which used to be at the transformed query block with corresponding fields in the new derived table containing the grouping operation of the original transformed query block. More... | |
virtual Item * | replace_item_view_ref (uchar *) |
virtual Item * | replace_outer_ref (uchar *) |
virtual bool | update_aggr_refs (uchar *) |
A walker processor overridden by Item_aggregate_ref, q.v. More... | |
virtual Item * | safe_charset_converter (THD *thd, const CHARSET_INFO *tocs) |
void | delete_self () |
Delete this item. More... | |
virtual bool | is_splocal () const |
virtual Settable_routine_parameter * | get_settable_routine_parameter () |
bool | is_temporal_with_date () const |
bool | is_temporal_with_date_and_time () const |
bool | is_temporal_with_time () const |
bool | is_temporal () const |
bool | has_compatible_context (Item *item) const |
Check whether this and the given item has compatible comparison context. More... | |
virtual Field::geometry_type | get_geometry_type () const |
String * | check_well_formed_result (String *str, bool send_error, bool truncate) |
Verifies that the input string is well-formed according to its character set. More... | |
bool | eq_by_collation (Item *item, bool binary_cmp, const CHARSET_INFO *cs) |
CostOfItem | cost () const |
uint32 | max_char_length () const |
uint32 | max_char_length (const CHARSET_INFO *cs) const |
void | fix_char_length (uint32 max_char_length_arg) |
virtual bool | is_outer_field () const |
bool | is_blob_field () const |
Check if an item either is a blob field, or will be represented as a BLOB field if a field is created based on this item. More... | |
uint | reference_count () const |
void | increment_ref_count () |
Increment reference count. More... | |
uint | decrement_ref_count () |
Decrement reference count. More... | |
bool | has_subquery () const |
bool | has_stored_program () const |
bool | has_aggregation () const |
void | set_aggregation () |
Set the "has aggregation" property. More... | |
void | reset_aggregation () |
Reset the "has aggregation" property. More... | |
bool | has_wf () const |
void | set_wf () |
Set the "has window function" property. More... | |
bool | has_grouping_set_dep () const |
void | set_group_by_modifier () |
Set the property: this item (tree) contains a reference to a GROUP BY modifier (such as ROLLUP) More... | |
bool | has_grouping_func () const |
void | set_grouping_func () |
Set the property: this item is a call to GROUPING. More... | |
virtual bool | created_by_in2exists () const |
Whether this Item was created by the IN->EXISTS subquery transformation. More... | |
void | mark_subqueries_optimized_away () |
virtual bool | gc_subst_analyzer (uchar **) |
Analyzer function for GC substitution. More... | |
virtual bool | replace_field_processor (uchar *) |
A processor that replaces any Fields with a Create_field_wrapper. More... | |
bool | can_be_substituted_for_gc (bool array=false) const |
Check if this item is of a type that is eligible for GC substitution. More... | |
void | aggregate_float_properties (enum_field_types type, Item **items, uint nitems) |
Set max_length and decimals of function if function is floating point and result length/precision depends on argument ones. More... | |
void | aggregate_decimal_properties (Item **items, uint nitems) |
Set data type, precision and scale of item of type decimal from list of items. More... | |
uint32 | aggregate_char_width (Item **items, uint nitems) |
Calculate the maximum number of characters required by any of the items. More... | |
void | aggregate_temporal_properties (enum_field_types type, Item **items, uint nitems) |
Set data type and fractional seconds precision for temporal functions. More... | |
bool | aggregate_string_properties (enum_field_types type, const char *name, Item **items, uint nitems) |
Aggregate string properties (character set, collation and maximum length) for string function. More... | |
void | aggregate_bit_properties (Item **items, uint nitems) |
Set data type and properties of a BIT column. More... | |
virtual bool | repoint_const_outer_ref (uchar *arg) |
This function applies only to Item_field objects referred to by an Item_ref object that has been marked as a const_item. More... | |
virtual bool | strip_db_table_name_processor (uchar *) |
virtual void | compute_cost (CostOfItem *root_cost) const |
Compute the cost of evaluating this Item. More... | |
bool | is_abandoned () const |
bool | is_nullable () const |
void | set_nullable (bool nullable) |
virtual bool | supports_partial_update (const Field_json *field) const |
Check if this expression can be used for partial update of a given JSON column. More... | |
virtual bool | returns_array () const |
Whether the item returns array of its data type. More... | |
virtual void | allow_array_cast () |
A helper function to ensure proper usage of CAST(. More... | |
Public Member Functions inherited from Parse_tree_node_tmpl< Context > | |
virtual | ~Parse_tree_node_tmpl ()=default |
bool | is_contextualized () const |
virtual bool | contextualize (Context *pc) final |
void | error (Context *pc, const POS &pos) const |
syntax_error() function replacement for deferred reporting of syntax errors More... | |
void | error (Context *pc, const POS &pos, const char *msg) const |
syntax_error() function replacement for deferred reporting of syntax errors More... | |
void | errorf (Context *pc, const POS &pos, const char *format,...) const |
syntax_error() function replacement for deferred reporting of syntax errors More... | |
Public Attributes | |
Item ** | referenced_by [2] |
For a group aggregate which is aggregated into an outer query block; none, or just the first or both cells may be non-zero. More... | |
Item_sum * | next_sum {nullptr} |
next in the circular chain of registered objects More... | |
Item_sum * | in_sum_func |
the containing set function if any More... | |
Query_block * | base_query_block |
query block where function is placed More... | |
Query_block * | aggr_query_block |
For a group aggregate, query block where function is aggregated. More... | |
int8 | max_aggr_level |
max level of unbound column references More... | |
int8 | max_sum_func_level |
max level of aggregation for contained functions More... | |
bool | allow_group_via_temp_table |
If incremental update of fields is supported. More... | |
nesting_map | save_deny_window_func |
WFs are forbidden when resolving Item_sum; this member is used to restore WF allowance status afterwards. More... | |
Public Attributes inherited from Item_func | |
uint | arg_count |
How many arguments in 'args'. More... | |
Public Attributes inherited from Item | |
Item * | next_free |
Intrusive list pointer for free list. More... | |
DTCollation | collation |
Character set and collation properties assigned for this Item. More... | |
Item_name_string | item_name |
Name from query. More... | |
Item_name_string | orig_name |
Original item name (if it was renamed) More... | |
uint32 | max_length |
Maximum length of result of evaluating this item, in number of bytes. More... | |
item_marker | marker |
This member has several successive meanings, depending on the phase we're in (. More... | |
Item_result | cmp_context |
Comparison context. More... | |
bool | fixed |
True if item has been resolved. More... | |
uint8 | decimals |
Number of decimals in result when evaluating this item. More... | |
bool | null_value |
True if item is null. More... | |
bool | unsigned_flag |
bool | m_is_window_function |
True if item represents window func. More... | |
bool | hidden {false} |
If the item is in a SELECT list (Query_block::fields) and hidden is true, the item wasn't actually in the list as given by the user (it was added by the optimizer, to e.g. More... | |
bool | m_in_check_constraint_exec_ctx {false} |
True if item is a top most element in the expression being evaluated for a check constraint. More... | |
Public Attributes inherited from Parse_tree_node_tmpl< Context > | |
POS | m_pos |
Protected Member Functions | |
void | unsupported_as_wf () |
void | add_json_info (Json_object *obj) override |
Add all the node-specific json fields. More... | |
Protected Member Functions inherited from Item_func | |
bool | param_type_uses_non_param (THD *thd, enum_field_types def=MYSQL_TYPE_VARCHAR) |
bool | param_type_is_default (THD *thd, uint start, uint end, uint step, enum_field_types def) |
For arguments of this Item_func ("args" array), in range [start, start+step, start+2*step,...,end[ : if they're a PS parameter with invalid (not known) type, give them default type "def". More... | |
bool | param_type_is_default (THD *thd, uint start, uint end, enum_field_types def=MYSQL_TYPE_VARCHAR) |
bool | param_type_is_rejected (uint start, uint end) |
For arguments of this Item_func ("args" array), in range [start,end[ : sends error if they're a dynamic parameter. More... | |
const Item_field * | contributes_to_filter (THD *thd, table_map read_tables, table_map filter_for_table, const MY_BITMAP *fields_to_ignore) const |
Whether or not an item should contribute to the filtering effect (. More... | |
virtual bool | may_have_named_parameters () const |
Named parameters are allowed in a parameter list. More... | |
bool | is_non_const_over_literals (uchar *) override |
bool | check_function_as_value_generator (uchar *checker_args) override |
Check if this item is allowed for a virtual column or inside a default expression. More... | |
bool | is_valid_for_pushdown (uchar *arg) override |
Check if all the columns present in this expression are from the derived table. More... | |
bool | check_column_in_window_functions (uchar *arg) override |
Check if all the columns present in this expression are present in PARTITION clause of window functions of the derived table. More... | |
bool | check_column_in_group_by (uchar *arg) override |
Check if all the columns present in this expression are present in GROUP BY clause of the derived table. More... | |
longlong | val_int_from_real () |
Protected Member Functions inherited from Item | |
String * | make_empty_result () |
Sets the result value of the function an empty string, using the current character set. More... | |
bool | skip_itemize (Item **res) |
Helper function to skip itemize() for grammar-allocated items. More... | |
virtual type_conversion_status | save_in_field_inner (Field *field, bool no_conversions) |
Helper function which does all of the work for save_in_field(Field*, bool), except some error checking common to all subclasses, which is performed by save_in_field() itself. More... | |
String * | val_string_from_real (String *str) |
String * | val_string_from_int (String *str) |
String * | val_string_from_decimal (String *str) |
String * | val_string_from_date (String *str) |
String * | val_string_from_datetime (String *str) |
String * | val_string_from_time (String *str) |
my_decimal * | val_decimal_from_real (my_decimal *decimal_value) |
my_decimal * | val_decimal_from_int (my_decimal *decimal_value) |
my_decimal * | val_decimal_from_string (my_decimal *decimal_value) |
my_decimal * | val_decimal_from_date (my_decimal *decimal_value) |
my_decimal * | val_decimal_from_time (my_decimal *decimal_value) |
longlong | val_int_from_decimal () |
longlong | val_int_from_date () |
longlong | val_int_from_time () |
longlong | val_int_from_datetime () |
longlong | val_int_from_string () |
double | val_real_from_decimal () |
double | val_real_from_string () |
bool | error_bool () |
Get the value to return from val_bool() in case of errors. More... | |
int | error_int () |
Get the value to return from val_int() in case of errors. More... | |
double | error_real () |
Get the value to return from val_real() in case of errors. More... | |
bool | error_date () |
Get the value to return from get_date() in case of errors. More... | |
bool | error_time () |
Get the value to return from get_time() in case of errors. More... | |
String * | null_return_str () |
Gets the value to return from val_str() when returning a NULL value. More... | |
bool | get_date_from_string (MYSQL_TIME *ltime, my_time_flags_t flags) |
Convert val_str() to date in MYSQL_TIME. More... | |
bool | get_date_from_real (MYSQL_TIME *ltime, my_time_flags_t flags) |
Convert val_real() to date in MYSQL_TIME. More... | |
bool | get_date_from_decimal (MYSQL_TIME *ltime, my_time_flags_t flags) |
Convert val_decimal() to date in MYSQL_TIME. More... | |
bool | get_date_from_int (MYSQL_TIME *ltime, my_time_flags_t flags) |
Convert val_int() to date in MYSQL_TIME. More... | |
bool | get_date_from_time (MYSQL_TIME *ltime) |
Convert get_time() from time to date in MYSQL_TIME. More... | |
bool | get_date_from_numeric (MYSQL_TIME *ltime, my_time_flags_t fuzzydate) |
Convert a numeric type to date. More... | |
bool | get_time_from_string (MYSQL_TIME *ltime) |
Convert val_str() to time in MYSQL_TIME. More... | |
bool | get_time_from_real (MYSQL_TIME *ltime) |
Convert val_real() to time in MYSQL_TIME. More... | |
bool | get_time_from_decimal (MYSQL_TIME *ltime) |
Convert val_decimal() to time in MYSQL_TIME. More... | |
bool | get_time_from_int (MYSQL_TIME *ltime) |
Convert val_int() to time in MYSQL_TIME. More... | |
bool | get_time_from_date (MYSQL_TIME *ltime) |
Convert date to time. More... | |
bool | get_time_from_datetime (MYSQL_TIME *ltime) |
Convert datetime to time. More... | |
bool | get_time_from_numeric (MYSQL_TIME *ltime) |
Convert a numeric type to time. More... | |
virtual longlong | val_date_temporal_at_utc () |
virtual longlong | val_time_temporal_at_utc () |
void | set_accum_properties (const Item *item) |
Set accumulated properties for an Item. More... | |
void | add_accum_properties (const Item *item) |
Add more accumulated properties to an Item. More... | |
void | set_subquery () |
Set the "has subquery" property. More... | |
void | set_stored_program () |
Set the "has stored program" property. More... | |
Protected Member Functions inherited from Parse_tree_node_tmpl< Context > | |
Parse_tree_node_tmpl ()=delete | |
Parse_tree_node_tmpl (const POS &pos) | |
Parse_tree_node_tmpl (const POS &start_pos, const POS &end_pos) | |
bool | begin_parse_tree (Show_parse_tree *tree) |
bool | end_parse_tree (Show_parse_tree *tree) |
virtual bool | do_contextualize (Context *pc) |
Do all context-sensitive things and mark the node as contextualized. More... | |
Static Protected Member Functions | |
static ulonglong | ram_limitation (THD *thd) |
Calculate the affordable RAM limit for structures like TREE or Unique used in Item_sum_*. More... | |
Static Protected Member Functions inherited from Item | |
static bool | bit_func_returns_binary (const Item *a, const Item *b) |
static bool | mark_field_in_map (Mark_field *mark_field, Field *field) |
Helper function for mark_field_in_map(uchar *arg). More... | |
Protected Attributes | |
Aggregator * | aggr {nullptr} |
Aggregator class instance. More... | |
PT_window * | m_window {nullptr} |
If sum is a window function, this field contains the window. More... | |
bool | m_window_resolved {false} |
True if we have already resolved this window functions window reference. More... | |
bool | forced_const {false} |
True means that this field has been evaluated during optimization. More... | |
bool | m_null_resolved {false} |
true if the function is resolved to be always NULL More... | |
bool | m_null_executed {false} |
true if the function is determined to be NULL at start of execution More... | |
Protected Attributes inherited from Item_func | |
Item ** | args |
Array of pointers to arguments. More... | |
bool | null_on_null {true} |
Affects how to determine that NULL argument implies a NULL function return. More... | |
uint | allowed_arg_cols {1} |
table_map | used_tables_cache {0} |
Value used in calculation of result of used_tables() More... | |
table_map | not_null_tables_cache {0} |
Value used in calculation of result of not_null_tables() More... | |
Protected Attributes inherited from Item_result_field | |
Field * | result_field {nullptr} |
Protected Attributes inherited from Item | |
String | str_value |
str_values's main purpose is to cache the value in save_in_field More... | |
uint8 | m_accum_properties |
Private Attributes | |
bool | force_copy_fields {false} |
Used in making ROLLUP. More... | |
bool | with_distinct {false} |
Indicates how the aggregate function was specified by the parser : true if it was written as AGGREGATE(DISTINCT), false if it was AGGREGATE() More... | |
Friends | |
class | Aggregator_distinct |
class | Aggregator_simple |
Additional Inherited Members | |
Static Public Member Functions inherited from Item | |
static void * | operator new (size_t size) noexcept |
static void * | operator new (size_t size, MEM_ROOT *mem_root, const std::nothrow_t &arg=std::nothrow) noexcept |
static void | operator delete (void *ptr, size_t size) |
static void | operator delete (void *, MEM_ROOT *, const std::nothrow_t &) noexcept |
static enum_field_types | result_to_type (Item_result result) |
static Item_result | type_to_result (enum_field_types type) |
static enum_field_types | type_for_variable (enum_field_types src_type) |
Provide data type for a user or system variable, based on the type of the item that is assigned to the variable. More... | |
static enum_field_types | string_field_type (uint32 max_bytes) |
Determine correct string field type, based on string length. More... | |
static const CHARSET_INFO * | default_charset () |
Static Public Member Functions inherited from Parse_tree_node_tmpl< Context > | |
static void * | operator new (size_t size, MEM_ROOT *mem_root, const std::nothrow_t &arg=std::nothrow) noexcept |
static void | operator delete (void *ptr, size_t size) |
static void | operator delete (void *, MEM_ROOT *, const std::nothrow_t &) noexcept |
Static Protected Attributes inherited from Item | |
static constexpr uint8 | PROP_SUBQUERY = 0x01 |
Set of properties that are calculated by accumulation from underlying items. More... | |
static constexpr uint8 | PROP_STORED_PROGRAM = 0x02 |
static constexpr uint8 | PROP_AGGREGATION = 0x04 |
static constexpr uint8 | PROP_WINDOW_FUNCTION = 0x08 |
static constexpr uint8 | PROP_HAS_GROUPING_SET_DEP = 0x10 |
Set if the item or one or more of the underlying items contains a GROUP BY modifier (such as ROLLUP). More... | |
static constexpr uint8 | PROP_GROUPING_FUNC = 0x20 |
Set if the item or one or more of the underlying items is a GROUPING function. More... | |
Class Item_sum is the base class used for special expressions that SQL calls 'set functions'.
These expressions are formed with the help of aggregate functions such as SUM, MAX, GROUP_CONCAT etc. Class Item_sum is also the base class for Window functions; the text below first documents set functions, then window functions.
GENERAL NOTES
A set function cannot be used in all positions where expressions are accepted. There are some quite explicable restrictions for the use of set functions.
In the query:
SELECT AVG(b) FROM t1 WHERE SUM(b) > 20 GROUP by a
the set function AVG(b) is valid, while the usage of SUM(b) is invalid. A WHERE condition must contain expressions that can be evaluated for each row of the table. Yet the expression SUM(b) can be evaluated only for each group of rows with the same value of column a. In the query:
SELECT AVG(b) FROM t1 WHERE c > 30 GROUP BY a HAVING SUM(b) > 20
both set function expressions AVG(b) and SUM(b) are valid.
We can say that in a query without nested selects an occurrence of a set function in an expression of the SELECT list or/and in the HAVING clause is valid, while in the WHERE clause, FROM clause or GROUP BY clause it is invalid.
The general rule to detect whether a set function is valid in a query with nested subqueries is much more complicated.
Consider the following query:
SELECT t1.a FROM t1 GROUP BY t1.a HAVING t1.a > ALL (SELECT t2.c FROM t2 WHERE SUM(t1.b) < t2.c).
The set function SUM(b) is used here in the WHERE clause of the subquery. Nevertheless it is valid since it is contained in the HAVING clause of the outer query. The expression SUM(t1.b) is evaluated for each group defined in the main query, not for groups of the subquery.
The problem of finding the query where to aggregate a particular set function is not so simple as it seems to be.
In the query: SELECT t1.a FROM t1 GROUP BY t1.a HAVING t1.a > ALL(SELECT t2.c FROM t2 GROUP BY t2.c HAVING SUM(t1.a) < t2.c)
the set function can be evaluated in both the outer and the inner query block. If we evaluate SUM(t1.a) for the outer query then we get the value of t1.a multiplied by the cardinality of a group in table t1. In this case, SUM(t1.a) is used as a constant value in each correlated subquery. But SUM(t1.a) can also be evaluated for the inner query. In this case t1.a will be a constant value for each correlated subquery and summation is performed for each group of table t2. (Here it makes sense to remind that the query
SELECT c FROM t GROUP BY a HAVING SUM(1) < a
is quite valid in our SQL).
So depending on what query block we assign the set function to we can get different results.
The general rule to detect the query block Q where a set function will be aggregated (evaluated) can be formulated as follows.
Reference: SQL2011 <set function specification> syntax rules 6 and 7.
Consider a set function S(E) where E is an expression which contains column references C1, ..., Cn. Resolve all column references Ci against the query block Qi containing the set function S(E). Let Q be the innermost query block of all query blocks Qi. (It should be noted here that S(E) in no way can be aggregated in the query block containing the subquery Q, otherwise S(E) would refer to at least one unbound column reference). If S(E) is used in a construct of Q where set functions are allowed then we aggregate S(E) in Q. Otherwise:
Let's demonstrate how this rule is applied to the following queries.
Set functions can generally not be nested. In the query
SELECT t1.a from t1 GROUP BY t1.a HAVING AVG(SUM(t1.b)) > 20
the expression SUM(b) is not valid, even though it is contained inside a HAVING clause. However, it is acceptable in the query:
SELECT t.1 FROM t1 GROUP BY t1.a HAVING SUM(t1.b) > 20.
An argument of a set function does not have to be a simple column reference as seen in examples above. This can be a more complex expression
SELECT t1.a FROM t1 GROUP BY t1.a HAVING SUM(t1.b+1) > 20.
The expression SUM(t1.b+1) has clear semantics in this context: we sum up the values of t1.b+1 where t1.b varies for all values within a group of rows that contain the same t1.a value.
A set function for an outer query yields a constant value within a subquery. So the semantics of the query
SELECT t1.a FROM t1 GROUP BY t1.a HAVING t1.a IN (SELECT t2.c FROM t2 GROUP BY t2.c HAVING AVG(t2.c+SUM(t1.b)) > 20)
is still clear. For a group of rows with the same value for t1.a, calculate the value of SUM(t1.b) as 's'. This value is substituted in the subquery:
SELECT t2.c FROM t2 GROUP BY t2.c HAVING AVG(t2.c+s)
By the same reason the following query with a subquery
SELECT t1.a FROM t1 GROUP BY t1.a HAVING t1.a IN (SELECT t2.c FROM t2 GROUP BY t2.c HAVING AVG(SUM(t1.b)) > 20) is also valid.
IMPLEMENTATION NOTES
The member base_query_block contains a reference to the query block that the set function is contained within.
The member aggr_query_block contains a reference to the query block where the set function is aggregated.
The field max_aggr_level holds the maximum of the nest levels of the unbound column references contained in the set function. A column reference is unbound within a set function if it is not bound by any subquery used as a subexpression in this function. A column reference is bound by a subquery if it is a reference to the column by which the aggregation of some set function that is used in the subquery is calculated. For the set function used in the query
SELECT t1.a FROM t1 GROUP BY t1.a HAVING t1.a > ALL(SELECT t2.b FROM t2 GROUP BY t2.b HAVING t2.b > ALL(SELECT t3.c FROM t3 GROUP BY t3.c HAVING SUM(t1.a+t2.b) < t3.c))
the value of max_aggr_level is equal to 1 since t1.a is bound in the main query, and t2.b is bound by the first subquery whose nest level is 1. Obviously a set function cannot be aggregated in a subquery whose nest level is less than max_aggr_level. (Yet it can be aggregated in the subqueries whose nest level is greater than max_aggr_level.) In the query SELECT t1.a FROM t1 HAVING AVG(t1.a+(SELECT MIN(t2.c) FROM t2))
the value of the max_aggr_level for the AVG set function is 0 since the reference t2.c is bound in the subquery.
If a set function contains no column references (like COUNT(*)), max_aggr_level is -1.
The field 'max_sum_func_level' is to contain the maximum of the nest levels of the set functions that are used as subexpressions of the arguments of the given set function, but not aggregated in any subquery within this set function. A nested set function s1 can be used within set function s0 only if s1.max_sum_func_level < s0.max_sum_func_level. Set function s1 is considered as nested for set function s0 if s1 is not calculated in any subquery within s0.
A set function that is used as a subexpression in an argument of another set function refers to the latter via the field 'in_sum_func'.
The condition imposed on the usage of set functions are checked when we traverse query subexpressions with the help of the recursive method fix_fields. When we apply this method to an object of the class Item_sum, first, on the descent, we call the method init_sum_func_check that initialize members used at checking. Then, on the ascent, we call the method check_sum_func that validates the set function usage and reports an error if it is invalid. The method check_sum_func serves to link the items for the set functions that are aggregated in the containing query blocks. Circular chains of such functions are attached to the corresponding Query_block structures through the field inner_sum_func_list.
Exploiting the fact that the members mentioned above are used in one recursive function we could have allocated them on the thread stack. Yet we don't do it now.
It is assumed that the nesting level of subqueries does not exceed 63 (valid nesting levels are stored in a 64-bit bitmap called nesting_map). The assumption is enforced in LEX::new_query().
WINDOW FUNCTIONS
Most set functions (e.g. SUM, COUNT, AVG) can also be used as window functions. In that case, notable differences compared to set functions are:
|
inline |
Item_sum::Item_sum | ( | const POS & | pos, |
PT_item_list * | opt_list, | ||
PT_window * | w | ||
) |
Copy constructor, need to perform subqueries with temporary tables.
Constructor used in processing select with temporary tebles.
|
pure virtual |
|
inlineoverrideprotectedvirtual |
Add all the node-specific json fields.
Any class that needs to add such info should override this function rather than doing it in do_contextualize(). E.g. the parse tree node for AVG() may have "distinct" field to indicate if AVG(DISTINCT ...) is used or not.
json_obj | Json object for this parse tree node. |
Reimplemented from Parse_tree_node_tmpl< Context >.
void Item_sum::add_used_tables_for_aggr_func | ( | ) |
Add used_tables information for aggregate function, based on its aggregated query block.
If the function is aggregated into its local context, it can be calculated only after evaluating the full join, thus it depends on all tables of this join. Otherwise, it depends on outer tables, even if its arguments args[] do not explicitly reference an outer table, like COUNT (*) or COUNT(123).
Window functions are always evaluated in the local scope and depend on all tables involved in the join since they cannot be evaluated until after the join is completed.
|
overridevirtual |
Reimplemented from Item.
|
overridevirtual |
Reimplemented from Item.
|
inline |
Called to add value to the aggregator.
|
inline |
Called to cleanup the aggregator.
|
inlinevirtual |
Called to initialize the aggregator.
Reimplemented in Item_rollup_sum_switcher.
Validate the semantic requirements of a set function.
Check whether the context of the set function allows it to be aggregated and, when it is an argument of another set function, directly or indirectly, the function makes sure that these two set functions are aggregated in different query blocks. If the context conditions are not met, an error is reported. If the set function is aggregated in some outer query block, it is added to the chain of items inner_sum_func_list attached to the aggregating query block.
A number of designated members of the object are used to check the conditions. They are specified in the comment before the Item_sum class declaration. Additionally a bitmap variable called allow_sum_func is employed. It is included into the LEX structure. The bitmap contains 1 at n-th position if the query block at level "n" allows a set function reference (i.e the current resolver context for the query block is either in the SELECT list or in the HAVING or ORDER BY clause).
Consider the query:
when the set functions are resolved, allow_sum_func will contain:
thd | reference to the thread context info |
ref | location of the pointer to this item in the containing expression |
|
virtual |
Only relevant for aggregates qua window functions.
Checks semantics after windows have been set up and checked. Window functions have specific requirements on the window specifications. Used at resolution time.
thd | Current thread | |
select | The current select | |
[out] | reqs | Holds collected requirements from this wf |
Reimplemented in Item_sum_json, Item_func_group_concat, Item_row_number, Item_sum_collect, Item_sum_hybrid, Item_sum_sum, Item_sum_json_object, Item_sum_variance, Item_rank, Item_cume_dist, Item_percent_rank, Item_ntile, Item_lead_lag, Item_first_last_value, and Item_nth_value.
|
inlinevirtual |
Like check_wf_semantics1.
For checks which cannot be done in resolution phase (mostly those for input parameters which can be '?' and must be >=0: value isn't known before execution phase).
Reimplemented in Item_ntile, Item_lead_lag, and Item_nth_value.
|
overridevirtual |
Remove the item from the list of inner aggregation functions in the Query_block it was moved to by Item_sum::check_sum_func().
This is done to undo some of the effects of Item_sum::check_sum_func() so that the item may be removed from the query.
If this is a window function, remove the reference from the window. This is needed when constant predicates are being removed.
Reimplemented from Item.
|
overridevirtual |
Called for every Item after use (preparation and execution).
Release all allocated resources, such as dynamic memory. Prepare for new execution by clearing cached values. Do not remove values allocated during preparation, destructor handles this.
Reimplemented from Item_result_field.
Reimplemented in Item_sum_count, Item_sum_avg, Item_sum_variance, Item_sum_hybrid, Item_sum_bit, Item_udf_sum, and Item_func_group_concat.
|
pure virtual |
Implemented in Item_sum_sum, Item_sum_count, Item_sum_json_array, Item_sum_json_object, Item_sum_avg, Item_sum_variance, Item_sum_hybrid, Item_sum_bit, Item_udf_sum, Item_func_group_concat, Item_row_number, Item_rank, Item_cume_dist, Item_percent_rank, Item_ntile, Item_lead_lag, Item_first_last_value, Item_nth_value, Item_rollup_sum_switcher, and Item_sum_collect.
|
overridevirtual |
Collects fields and view references that have the qualifying table in the specified query block.
Don't walk below grouped aggregate functions
Reimplemented from Item.
|
overridevirtual |
Don't walk below grouped aggregate functions
Reimplemented from Item.
Reimplemented in Item_sum_avg, Item_sum_variance, Item_sum_hybrid, and Item_rollup_sum_switcher.
|
overridevirtual |
The core function that does the actual itemization.
itemize() is just a wrapper over this.
Reimplemented from Item_func.
Reimplemented in Item_udf_sum, Item_func_group_concat, and PTI_count_sym.
|
overridevirtual |
Reimplemented from Item_func.
|
overridevirtual |
Fix after tables have been moved from one query_block level to the parent level, e.g by semijoin conversion.
Basically re-calculate all attributes dependent on the tables.
parent_query_block | query_block that tables are moved to. |
removed_query_block | query_block that tables are moved away from, child of parent_query_block. |
Reimplemented from Item_func.
Reimplemented from Item_func.
Reimplemented in Item_sum_num, Item_sum_hybrid, Item_func_group_concat, Item_non_framing_wf, Item_ntile, Item_lead_lag, Item_first_last_value, Item_nth_value, Item_sum_json, Item_sum_bit, Item_udf_sum, and Item_sum_collect.
|
inlinevirtual |
All aggregates are framing, i.e.
they work on the window's frame. If none is defined, the frame is by default the entire partition, unless ORDER BY is defined, in which case it is the set of rows from the start of the partition to and including the peer set of the current row.
Some window functions are not framing, i.e. they always work on the entire partition. For such window functions, the method is overridden to return false.
Reimplemented in Item_non_framing_wf.
|
inline |
|
overridevirtual |
Check if an aggregate is referenced from within the GROUP BY clause of the query block in which it is aggregated.
Such references will be rejected.
true | if this is an aggregate which is referenced from the GROUP BY clause of the aggregating query block |
false | otherwise |
Reimplemented from Item.
|
inline |
|
inline |
bool Item_sum::init_sum_func_check | ( | THD * | thd | ) |
Prepare an aggregate function for checking of context.
The function initializes the members of the Item_sum object. It also checks the general validity of the set function: If none of the currently active query blocks allow evaluation of set functions, an error is reported.
thd | reference to the thread context info |
|
inlineoverridevirtual |
The method allows to determine nullness of a complex expression without fully evaluating it, instead of calling val*() then checking null_value.
Used in Item_func_isnull/Item_func_isnotnull and Item_sum_count/Item_sum_count_distinct. Any item which can be NULL must implement this method.
false | if the expression is not NULL. |
true | if the expression is NULL, or evaluation caused an error. The null_value member is set according to the return value. |
Reimplemented from Item_func.
Reimplemented in Item_rollup_sum_switcher.
|
inlinevirtual |
Overridden by Item_rollup_sum_switcher.
Reimplemented in Item_rollup_sum_switcher.
|
inlinevirtual |
Reimplemented in Item_sum_hybrid.
|
inline |
|
inlinevirtual |
Reimplemented in Item_func_group_concat.
void Item_sum::mark_as_sum_func | ( | ) |
void Item_sum::mark_as_sum_func | ( | Query_block * | cur_query_block | ) |
|
inlinevirtual |
Return true if we need to make two passes over the rows in the partition - either because we need the cardinality of it (and we need to read all rows to detect the next partition), or we need to have all partition rows available to evaluate the window function for some other reason, e.g.
we may need the last row in the partition in the frame buffer to be able to evaluate LEAD.
Reimplemented in Item_cume_dist, Item_percent_rank, Item_ntile, and Item_lead_lag.
|
inlineoverridevirtual |
Mark an aggregate as having no rows.
This function is called by the execution engine to assign 'NO ROWS FOUND' value to an aggregate item, when the underlying result set has no rows. Such value, in a general case, may be different from the default value of the item after 'clear()': e.g. a numeric item may be initialized to 0 by clear() and to NULL by no_rows_in_result().
Reimplemented from Item.
Reimplemented in Item_sum_sum, Item_sum_count, Item_sum_variance, Item_sum_hybrid, and Item_func_group_concat.
|
inlineoverridevirtual |
Return table map of tables that can't be NULL tables (tables that are used in a context where if they would contain a NULL row generated by a LEFT or RIGHT join, the item would not be true).
This expression is used on WHERE item to determinate if a LEFT JOIN can be converted to a normal join. Generally this function should return used_tables() if the function would return null if any of the arguments are null As this is only used in the beginning of optimization, the value don't have to be updated in update_used_tables()
Reimplemented from Item_func.
|
overridevirtual |
This method is used for to:
For more information about view definition query, INFORMATION_SCHEMA query and why they should be generated from the Item-tree,
Reimplemented from Item_func.
Reimplemented in Item_udf_sum, Item_func_group_concat, and Item_rollup_sum_switcher.
Calculate the affordable RAM limit for structures like TREE or Unique used in Item_sum_*.
|
inlinevirtual |
Reimplemented in Item_rollup_sum_switcher.
|
inline |
Resets the aggregate value to its default and aggregates the current value of its attribute(s).
|
pure virtual |
|
overridevirtual |
Reset execution state for such window function types as determined by arg.
arg | pointing to a bool which, if true, says to reset state for framing window function, else for non-framing |
Reimplemented from Item.
|
overridevirtual |
Resolve type-related information for this item, such as result field type, maximum size, precision, signedness, character set and collation.
Also check compatibility of argument types and return error when applicable. Also adjust nullability when applicable.
thd | thread handler |
Reimplemented from Item_func.
Reimplemented in Item_sum_variance, Item_sum_bit, Item_sum_udf_float, Item_sum_udf_int, Item_sum_udf_str, Item_sum_udf_decimal, Item_rollup_sum_switcher, Item_sum_sum, Item_sum_count, Item_sum_avg, Item_row_number, Item_rank, Item_cume_dist, Item_percent_rank, Item_ntile, Item_lead_lag, Item_first_last_value, and Item_nth_value.
Reimplemented in Item_sum_avg, Item_sum_variance, Item_sum_std, and Item_sum_bit.
|
virtual |
Reimplemented in Item_rollup_sum_switcher, and Item_sum_collect.
Reimplemented from Item_func.
Reimplemented in Item_rollup_sum_switcher.
|
inline |
|
inlinevirtual |
Reimplemented in Item_func_group_concat.
|
overridevirtual |
See comments in Item_cmp_func::split_sum_func()
Reimplemented from Item_func.
Reimplemented in Item_sum_hybrid, Item_lead_lag, Item_first_last_value, and Item_nth_value.
|
pure virtual |
Implemented in Item_sum_sum, Item_sum_count, Item_sum_json, Item_sum_avg, Item_sum_variance, Item_sum_std, Item_sum_min, Item_sum_max, Item_sum_bit, Item_udf_sum, Item_func_group_concat, Item_row_number, Item_rank, Item_cume_dist, Item_percent_rank, Item_ntile, Item_lead_lag, Item_first_last_value, Item_nth_value, Item_rollup_sum_switcher, and Item_sum_collect.
|
inlineprotected |
|
inlinevirtual |
Non-const version.
Reimplemented in Item_rollup_sum_switcher.
|
inlinevirtual |
In case we are an Item_rollup_sum_switcher, return the underlying Item_sum, otherwise, return this.
Overridden by Item_rollup_sum_switcher.
Reimplemented in Item_rollup_sum_switcher.
|
inlinevirtual |
Signal to the function that its arguments may have changed, and that any internal caches etc.
based on those arguments must be updated accordingly.
This is used by the hypergraph optimizer when it rewrites arguments to window functions to take into account that they have been materialized into temporary tables, or that they should read their values from the framebuffer.
Reimplemented in Item_sum_hybrid, Item_rank, Item_lead_lag, Item_first_last_value, and Item_nth_value.
|
pure virtual |
|
overridevirtual |
Updates used tables, not null tables information and accumulates properties up the item tree, cf.
used_tables_cache, not_null_tables_cache and m_accum_properties.
TODO(sgunders): Consider just removing these caches; it causes a lot of bugs (cache invalidation is known to be a complex problem), and the performance benefits are dubious.
Reimplemented from Item_func.
|
inlineoverridevirtual |
Reimplemented from Item_func.
Reimplemented in Item_rollup_sum_switcher.
|
inlinevirtual |
Only for framing window functions.
True if this function only needs to read one row per frame.
Reimplemented in Item_sum_hybrid, Item_first_last_value, and Item_nth_value.
bool Item_sum::wf_common_init | ( | ) |
Common initial actions for window functions.
For non-buffered processing ("on-the-fly"), check partition change and possible reset partition state. In this case return false. For buffered processing, if windowing state m_do_copy_null is true, set null_value to is_nullable() and return true.
|
inline |
|
inline |
|
friend |
|
friend |
|
protected |
Aggregator class instance.
Not set initially. Allocated only after it is determined if the incoming data are already distinct.
Query_block* Item_sum::aggr_query_block |
For a group aggregate, query block where function is aggregated.
For a window function, nullptr, as such function is always aggregated in base_query_block, as it mustn't contain any outer reference.
bool Item_sum::allow_group_via_temp_table |
If incremental update of fields is supported.
Query_block* Item_sum::base_query_block |
query block where function is placed
|
private |
Used in making ROLLUP.
Set for the ROLLUP copies of the original Item_sum and passed to create_tmp_field() to cause it to work over the temp table buffer that is referenced by Item_result_field::result_field.
|
protected |
True means that this field has been evaluated during optimization.
When set, used_tables() returns zero and const_item() returns true. The value must be reset to false after execution.
Item_sum* Item_sum::in_sum_func |
the containing set function if any
|
protected |
true if the function is determined to be NULL at start of execution
|
protected |
true if the function is resolved to be always NULL
If sum is a window function, this field contains the window.
|
protected |
True if we have already resolved this window functions window reference.
Used in execution of prepared statement to avoid re-resolve.
int8 Item_sum::max_aggr_level |
max level of unbound column references
int8 Item_sum::max_sum_func_level |
max level of aggregation for contained functions
Item** Item_sum::referenced_by[2] |
For a group aggregate which is aggregated into an outer query block; none, or just the first or both cells may be non-zero.
nesting_map Item_sum::save_deny_window_func |
WFs are forbidden when resolving Item_sum; this member is used to restore WF allowance status afterwards.
|
private |
Indicates how the aggregate function was specified by the parser : true if it was written as AGGREGATE(DISTINCT), false if it was AGGREGATE()