MySQL 8.3.0
Source Code Documentation
item.h File Reference
#include <sys/types.h>
#include <cfloat>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <memory>
#include <new>
#include <optional>
#include <string>
#include <type_traits>
#include <vector>
#include "decimal.h"
#include "field_types.h"
#include "lex_string.h"
#include "memory_debugging.h"
#include "my_alloc.h"
#include "my_bitmap.h"
#include "my_compiler.h"
#include "my_dbug.h"
#include "my_double2ulonglong.h"
#include "my_inttypes.h"
#include "my_sys.h"
#include "my_table_map.h"
#include "my_time.h"
#include "mysql/strings/dtoa.h"
#include "mysql/strings/m_ctype.h"
#include "mysql/strings/my_strtoll10.h"
#include "mysql/udf_registration_types.h"
#include "mysql_com.h"
#include "mysql_time.h"
#include "mysqld_error.h"
#include "nulls.h"
#include "sql-common/my_decimal.h"
#include "sql/enum_query_type.h"
#include "sql/field.h"
#include "sql/mem_root_array.h"
#include "sql/parse_location.h"
#include "sql/parse_tree_node_base.h"
#include "sql/sql_array.h"
#include "sql/sql_const.h"
#include "sql/sql_list.h"
#include "sql/table.h"
#include "sql/table_trigger_field_support.h"
#include "sql/thr_malloc.h"
#include "sql/trigger_def.h"
#include "sql_string.h"
#include "string_with_len.h"
#include "template_utils.h"

Go to the source code of this file.

Classes

class  DTCollation
 
class  Mark_field
 Class used as argument to Item::walk() together with mark_field_in_map() More...
 
class  Used_tables
 Class used as argument to Item::walk() together with used_tables_for_level() More...
 
class  Name_string
 Storage for name strings. More...
 
class  Item_name_string
 Storage for Item names. More...
 
struct  Name_resolution_context
 
struct  Check_function_as_value_generator_parameters
 Struct used to pass around arguments to/from check_function_as_value_generator. More...
 
class  Name_resolution_context_state
 
class  Bool3
 A type for SQL-like 3-valued Booleans: true/false/unknown. More...
 
class  Type_properties
 Type properties, used to collect type information for later assignment to an Item object. More...
 
class  Settable_routine_parameter
 
class  Item_tree_walker
 Utility mixin class to be able to walk() only parts of item trees. More...
 
class  CostOfItem
 This class represents the cost of evaluating an Item. More...
 
struct  ContainedSubquery
 This class represents a subquery contained in some subclass of Item_subselect,. More...
 
class  Item
 Base class that is used to represent any kind of expression in a relational query. More...
 
class  Item::Collect_item_fields_or_refs
 
class  Item::Collect_item_fields_or_view_refs
 
class  Item::Cleanup_after_removal_context
 Context object for (functions that override) Item::clean_up_after_removal(). More...
 
struct  Item::Css_info
 Minion class under Collect_scalar_subquery_info. More...
 
struct  Item::Collect_scalar_subquery_info
 Context struct used by walk method collect_scalar_subqueries to accumulate information about scalar subqueries found. More...
 
struct  Item::Replace_equal
 
struct  Item::Item_replacement
 
struct  Item::Item_field_replacement
 
struct  Item::Item_view_ref_replacement
 
struct  Item::Aggregate_replacement
 
struct  Item::Aggregate_ref_update
 
struct  cache_const_expr_arg
 Descriptor of what and how to cache for Item::cache_const_expr_transformer/analyzer. More...
 
class  Item_basic_constant
 
class  Item_sp_variable
 
class  Item_splocal
 
class  Item_case_expr
 
class  Item_name_const
 
class  Item_num
 
class  Item_ident
 
struct  Item_ident::Change_context
 < Argument object to change_context_processor More...
 
struct  Item_ident::Depended_change
 Argument structure for walk processor Item::update_depended_from. More...
 
class  Item_ident_for_show
 
class  Item_field
 
class  Item_asterisk
 Represents [schema. More...
 
class  Item_null
 
class  Item_param
 Dynamic parameters used as placeholders ('?') inside prepared statements. More...
 
class  Item_int
 
class  Item_int_0
 Item_int with value==0 and length==1. More...
 
class  Item_temporal
 
class  Item_uint
 
class  Item_decimal
 
class  Item_float
 
class  Item_func_pi
 
class  Item_string
 
class  Item_static_string_func
 
class  Item_partition_func_safe_string
 
class  Item_blob
 
class  Item_empty_string
 Item_empty_string – is a utility class to put an item into List<Item> which is then used in protocol.send_result_set_metadata() when sending SHOW output to the client. More...
 
class  Item_return_int
 
class  Item_hex_string
 
class  Item_bin_string
 
class  Item_result_field
 Item with result field. More...
 
class  Item_ref
 
class  Item_view_ref
 Class for fields from derived tables and views. More...
 
class  Item_outer_ref
 
class  Item_ref_null_helper
 
class  Item_int_with_ref
 
class  Item_temporal_with_ref
 
class  Item_datetime_with_ref
 
class  Item_time_with_ref
 
class  Item_metadata_copy
 A dummy item that contains a copy/backup of the given Item's metadata; not valid for data. More...
 
class  Cached_item
 This is used for segregating rows in groups (e.g. More...
 
class  Cached_item_str
 
class  Cached_item_json
 Cached_item subclass for JSON values. More...
 
class  Cached_item_real
 
class  Cached_item_int
 
class  Cached_item_temporal
 
class  Cached_item_decimal
 
class  Item_default_value
 
class  Item_insert_value
 
class  Item_trigger_field
 Represents NEW/OLD version of field of row which is changed/read in trigger. More...
 
class  Item_cache
 
class  Item_cache_int
 
class  Item_cache_bit
 Cache class for BIT type expressions. More...
 
class  Item_cache_real
 
class  Item_cache_decimal
 
class  Item_cache_str
 
class  Item_cache_row
 
class  Item_cache_datetime
 
class  Item_cache_json
 An item cache for values of type JSON. More...
 
class  Item_aggregate_type
 Interface for storing an aggregation of type and type specification of multiple Item objects. More...
 
class  Item_type_holder
 Item_type_holder stores an aggregation of name, type and type specification of UNIONS and derived tables. More...
 
class  Item_values_column
 Reference item that encapsulates both the type and the contained items of a single column of a VALUES ROW query expression. More...
 
class  Item_json
 A class that represents a constant JSON value. More...
 

Macros

#define MY_COLL_ALLOW_SUPERSET_CONV   1
 
#define MY_COLL_ALLOW_COERCIBLE_CONV   2
 
#define MY_COLL_DISALLOW_NONE   4
 
#define MY_COLL_ALLOW_NUMERIC_CONV   8
 
#define MY_COLL_ALLOW_CONV    (MY_COLL_ALLOW_SUPERSET_CONV | MY_COLL_ALLOW_COERCIBLE_CONV)
 
#define MY_COLL_CMP_CONV   (MY_COLL_ALLOW_CONV | MY_COLL_DISALLOW_NONE)
 
#define NAME_STRING(x)   Name_string(STRING_WITH_LEN(x))
 
#define NO_FIELD_INDEX   ((uint16)(-1))
 

Typedefs

typedef Bounds_checked_array< Item * > Ref_item_array
 
typedef enum monotonicity_info enum_monotonicity_info
 
typedef bool(Item::* Item_analyzer) (uchar **argp)
 
typedef Item *(Item::* Item_transformer) (uchar *arg)
 Type for transformers used by Item::transform and Item::compile. More...
 
typedef void(* Cond_traverser) (const Item *item, void *arg)
 

Enumerations

enum  monotonicity_info {
  NON_MONOTONIC , MONOTONIC_INCREASING , MONOTONIC_INCREASING_NOT_NULL , MONOTONIC_STRICT_INCREASING ,
  MONOTONIC_STRICT_INCREASING_NOT_NULL
}
 

Functions

void item_init (void)
 Init all special items. More...
 
static uint32 char_to_byte_length_safe (uint32 char_length_arg, uint32 mbmaxlen_arg)
 
Item_result numeric_context_result_type (enum_field_types data_type, Item_result result_type, uint8 decimals)
 
template<typename T >
void SafeIncrement (T *num)
 Increment *num if it is less than its maximal value. More...
 
template<class T >
bool WalkItem (Item *item, enum_walk walk, T &&functor)
 A helper class to give in a functor to Item::walk(). More...
 
template<class T >
bool WalkItem (const Item *item, enum_walk walk, T &&functor)
 Overload for const 'item' and functor taking 'const Item*' argument. More...
 
template<class T , class U >
ItemCompileItem (Item *item, T &&analyzer, U &&transformer)
 Same as WalkItem, but for Item::compile(). More...
 
template<class T >
ItemTransformItem (Item *item, T &&transformer)
 Same as WalkItem, but for Item::transform(). More...
 
bool agg_item_collations_for_comparison (DTCollation &c, const char *name, Item **items, uint nitems, uint flags)
 
bool agg_item_set_converter (DTCollation &coll, const char *fname, Item **args, uint nargs, uint flags, int item_sep, bool only_consts)
 
bool agg_item_charsets (DTCollation &c, const char *name, Item **items, uint nitems, uint flags, int item_sep, bool only_consts)
 
bool agg_item_charsets_for_string_result (DTCollation &c, const char *name, Item **items, uint nitems, int item_sep=1)
 
bool agg_item_charsets_for_comparison (DTCollation &c, const char *name, Item **items, uint nitems, int item_sep=1)
 
Item_fieldFindEqualField (Item_field *item_field, table_map reachable_tables, bool replace, bool *found)
 
longlong longlong_from_string_with_check (const CHARSET_INFO *cs, const char *cptr, const char *end, int unsigned_target)
 Converts a string to a longlong integer, with warnings. More...
 
double double_from_string_with_check (const CHARSET_INFO *cs, const char *cptr, const char *end)
 
Cached_itemnew_Cached_item (THD *thd, Item *item)
 Create right type of Cached_item for an item. More...
 
Item_result item_cmp_type (Item_result a, Item_result b)
 
bool resolve_const_item (THD *thd, Item **ref, Item *cmp_item)
 Substitute a const item with a simpler const item, if possible. More...
 
int stored_field_cmp_to_item (THD *thd, Field *field, Item *item)
 Compare the value stored in field with the expression from the query. More...
 
bool is_null_on_empty_table (THD *thd, Item_field *i)
 Check if the column reference that is currently being resolved, will be set to NULL if its qualifying query returns zero rows. More...
 
void convert_and_print (const String *from_str, String *to_str, const CHARSET_INFO *to_cs)
 Helper method: Convert string to the given charset, then print. More...
 
std::string ItemToString (const Item *item)
 
size_t CountVisibleFields (const mem_root_deque< Item * > &fields)
 
size_t CountHiddenFields (const mem_root_deque< Item * > &fields)
 
ItemGetNthVisibleField (const mem_root_deque< Item * > &fields, size_t index)
 
bool ItemsAreEqual (const Item *a, const Item *b, bool binary_cmp)
 Returns true iff the two items are equal, as in a->eq(b), after unwrapping refs and Item_cache objects. More...
 
bool AllItemsAreEqual (const Item *const *a, const Item *const *b, int num_items, bool binary_cmp)
 Returns true iff all items in the two arrays (which must be of the same size) are equal, as in a->eq(b), after unwrapping refs and Item_cache objects. More...
 

Variables

constexpr float COND_FILTER_ALLPASS {1.0f}
 Default condition filtering (selectivity) values used by get_filtering_effect() and friends when better estimates (statistics) are not available for a predicate. More...
 
constexpr float COND_FILTER_EQUALITY {0.1f}
 Filtering effect for equalities: col1 = col2. More...
 
constexpr float COND_FILTER_INEQUALITY {0.3333f}
 Filtering effect for inequalities: col1 > col2. More...
 
constexpr float COND_FILTER_BETWEEN {0.1111f}
 Filtering effect for between: col1 BETWEEN a AND b. More...
 
constexpr float COND_FILTER_STALE {-1.0f}
 Value is out-of-date, will need recalculation. More...
 
constexpr float COND_FILTER_STALE_NO_CONST {-2.0f}
 A special subcase of the above: More...
 
const Name_string null_name_string
 
const String my_null_string
 

Macro Definition Documentation

◆ MY_COLL_ALLOW_COERCIBLE_CONV

#define MY_COLL_ALLOW_COERCIBLE_CONV   2

◆ MY_COLL_ALLOW_CONV

#define MY_COLL_ALLOW_CONV    (MY_COLL_ALLOW_SUPERSET_CONV | MY_COLL_ALLOW_COERCIBLE_CONV)

◆ MY_COLL_ALLOW_NUMERIC_CONV

#define MY_COLL_ALLOW_NUMERIC_CONV   8

◆ MY_COLL_ALLOW_SUPERSET_CONV

#define MY_COLL_ALLOW_SUPERSET_CONV   1

◆ MY_COLL_CMP_CONV

#define MY_COLL_CMP_CONV   (MY_COLL_ALLOW_CONV | MY_COLL_DISALLOW_NONE)

◆ MY_COLL_DISALLOW_NONE

#define MY_COLL_DISALLOW_NONE   4

◆ NAME_STRING

#define NAME_STRING (   x)    Name_string(STRING_WITH_LEN(x))

◆ NO_FIELD_INDEX

#define NO_FIELD_INDEX   ((uint16)(-1))

Typedef Documentation

◆ Cond_traverser

typedef void(* Cond_traverser) (const Item *item, void *arg)

◆ enum_monotonicity_info

◆ Item_analyzer

typedef bool(Item::* Item_analyzer) (uchar **argp)

◆ Item_transformer

typedef Item *(Item::* Item_transformer) (uchar *arg)

Type for transformers used by Item::transform and Item::compile.

Parameters
argArgument used by the transformer. Really a typeless pointer in spite of the uchar type (historical reasons). The transformer needs to cast this to the desired pointer type
Returns
The transformed item

◆ Ref_item_array

Enumeration Type Documentation

◆ monotonicity_info

Enumerator
NON_MONOTONIC 
MONOTONIC_INCREASING 
MONOTONIC_INCREASING_NOT_NULL 
MONOTONIC_STRICT_INCREASING 
MONOTONIC_STRICT_INCREASING_NOT_NULL 

Function Documentation

◆ agg_item_charsets()

bool agg_item_charsets ( DTCollation c,
const char *  name,
Item **  items,
uint  nitems,
uint  flags,
int  item_sep,
bool  only_consts 
)

◆ agg_item_charsets_for_comparison()

bool agg_item_charsets_for_comparison ( DTCollation c,
const char *  name,
Item **  items,
uint  nitems,
int  item_sep = 1 
)
inline

◆ agg_item_charsets_for_string_result()

bool agg_item_charsets_for_string_result ( DTCollation c,
const char *  name,
Item **  items,
uint  nitems,
int  item_sep = 1 
)
inline

◆ agg_item_collations_for_comparison()

bool agg_item_collations_for_comparison ( DTCollation c,
const char *  name,
Item **  items,
uint  nitems,
uint  flags 
)

◆ agg_item_set_converter()

bool agg_item_set_converter ( DTCollation coll,
const char *  fname,
Item **  args,
uint  nargs,
uint  flags,
int  item_sep,
bool  only_consts 
)

◆ AllItemsAreEqual()

bool AllItemsAreEqual ( const Item *const *  a,
const Item *const *  b,
int  num_items,
bool  binary_cmp 
)

Returns true iff all items in the two arrays (which must be of the same size) are equal, as in a->eq(b), after unwrapping refs and Item_cache objects.

◆ char_to_byte_length_safe()

static uint32 char_to_byte_length_safe ( uint32  char_length_arg,
uint32  mbmaxlen_arg 
)
inlinestatic

◆ CompileItem()

template<class T , class U >
Item * CompileItem ( Item item,
T &&  analyzer,
U &&  transformer 
)
inline

Same as WalkItem, but for Item::compile().

Use as e.g.:

Item *item = CompileItem(root_item, [](Item *item) { return true; }, // Analyzer. [](Item *item) { return item; }); // Transformer.

◆ convert_and_print()

void convert_and_print ( const String from_str,
String to_str,
const CHARSET_INFO to_cs 
)

Helper method: Convert string to the given charset, then print.

Parameters
from_strString to be converted.
to_strQuery string.
to_csCharacter set to which the string is to be converted.

◆ CountHiddenFields()

size_t CountHiddenFields ( const mem_root_deque< Item * > &  fields)
inline

◆ CountVisibleFields()

size_t CountVisibleFields ( const mem_root_deque< Item * > &  fields)
inline

◆ double_from_string_with_check()

double double_from_string_with_check ( const CHARSET_INFO cs,
const char *  cptr,
const char *  end 
)

◆ FindEqualField()

Item_field * FindEqualField ( Item_field item_field,
table_map  reachable_tables,
bool  replace,
bool *  found 
)

◆ GetNthVisibleField()

Item * GetNthVisibleField ( const mem_root_deque< Item * > &  fields,
size_t  index 
)
inline

◆ is_null_on_empty_table()

bool is_null_on_empty_table ( THD thd,
Item_field i 
)

Check if the column reference that is currently being resolved, will be set to NULL if its qualifying query returns zero rows.

This is true for non-aggregated column references in the SELECT list, if the query block uses aggregation without grouping. For example:

SELECT COUNT(*), col FROM t WHERE some_condition

Here, if the table t is empty, or some_condition doesn't match any rows in t, the query returns one row where col is NULL, even if col is a not-nullable column.

Such column references are rejected if the ONLY_FULL_GROUP_BY SQL mode is enabled, in a later resolution phase.

◆ item_cmp_type()

Item_result item_cmp_type ( Item_result  a,
Item_result  b 
)

◆ item_init()

void item_init ( void  )

Init all special items.

◆ ItemsAreEqual()

bool ItemsAreEqual ( const Item a,
const Item b,
bool  binary_cmp 
)

Returns true iff the two items are equal, as in a->eq(b), after unwrapping refs and Item_cache objects.

◆ ItemToString()

std::string ItemToString ( const Item item)

◆ longlong_from_string_with_check()

longlong longlong_from_string_with_check ( const CHARSET_INFO cs,
const char *  cptr,
const char *  end,
int  unsigned_target 
)

Converts a string to a longlong integer, with warnings.

Parameters
cscharset of string
cptrbeginning of string
endend of string
unsigned_targetIf 0, caller will use result as a signed integer; if 1: an unsigned integer; if -1: caller doesn't tell. This influences warnings.

◆ new_Cached_item()

Cached_item * new_Cached_item ( THD thd,
Item item 
)

Create right type of Cached_item for an item.

◆ numeric_context_result_type()

Item_result numeric_context_result_type ( enum_field_types  data_type,
Item_result  result_type,
uint8  decimals 
)
inline

◆ resolve_const_item()

bool resolve_const_item ( THD thd,
Item **  ref,
Item comp_item 
)

Substitute a const item with a simpler const item, if possible.

Parameters
thdCurrent session.
[in,out]refConst item to be processed, contains simplest possible item on return.
comp_itemItem that provides result type for generated const item
Returns
false if success, true if error

◆ SafeIncrement()

template<typename T >
void SafeIncrement ( T *  num)

Increment *num if it is less than its maximal value.

◆ stored_field_cmp_to_item()

int stored_field_cmp_to_item ( THD thd,
Field field,
Item item 
)

Compare the value stored in field with the expression from the query.

Parameters
thdCurrent session.
fieldField which the Item is stored in after conversion
itemOriginal expression from query
Returns
Returns an integer greater than, equal to, or less than 0 if the value stored in the field is greater than, equal to, or less than the original Item. A 0 may also be returned if out of memory.
Note
We use this in the range optimizer/partition pruning, because in some cases we can't store the value in the field without some precision/character loss.

We similarly use it to verify that expressions like BIGINT_FIELD <cmp> <literal value> is done correctly (as int/decimal/float according to literal type).

◆ TransformItem()

template<class T >
Item * TransformItem ( Item item,
T &&  transformer 
)

Same as WalkItem, but for Item::transform().

Use as e.g.:

Item *item = TransformItem(root_item, [](Item *item) { return item; });

◆ WalkItem() [1/2]

template<class T >
bool WalkItem ( const Item item,
enum_walk  walk,
T &&  functor 
)
inline

Overload for const 'item' and functor taking 'const Item*' argument.

◆ WalkItem() [2/2]

template<class T >
bool WalkItem ( Item item,
enum_walk  walk,
T &&  functor 
)
inline

A helper class to give in a functor to Item::walk().

Use as e.g.:

bool result = WalkItem(root_item, enum_walk::POSTFIX, [](Item *item) { ... });

TODO: Make Item::walk() just take in a functor in the first place, instead of a pointer-to-member and an opaque argument.

Variable Documentation

◆ COND_FILTER_ALLPASS

constexpr float COND_FILTER_ALLPASS {1.0f}
constexpr

Default condition filtering (selectivity) values used by get_filtering_effect() and friends when better estimates (statistics) are not available for a predicate.

For predicates that are always satisfied. Must be 1.0 or the filter calculation logic will break down.

◆ COND_FILTER_BETWEEN

constexpr float COND_FILTER_BETWEEN {0.1111f}
constexpr

Filtering effect for between: col1 BETWEEN a AND b.

◆ COND_FILTER_EQUALITY

constexpr float COND_FILTER_EQUALITY {0.1f}
constexpr

Filtering effect for equalities: col1 = col2.

◆ COND_FILTER_INEQUALITY

constexpr float COND_FILTER_INEQUALITY {0.3333f}
constexpr

Filtering effect for inequalities: col1 > col2.

◆ COND_FILTER_STALE

constexpr float COND_FILTER_STALE {-1.0f}
constexpr

Value is out-of-date, will need recalculation.

This is used by post-greedy-search logic which changes the access method and thus makes obsolete the filtering value calculated by best_access_path(). For example, test_if_skip_sort_order().

◆ COND_FILTER_STALE_NO_CONST

constexpr float COND_FILTER_STALE_NO_CONST {-2.0f}
constexpr

A special subcase of the above:

  • if this is table/index/range scan, and
  • rows_fetched is how many rows we will examine, and
  • rows_fetched is less than the number of rows in the table (as determined by test_if_cheaper_ordering() and test_if_skip_sort_order()). Unlike the ordinary case where rows_fetched:
  • is set by calculate_scan_cost(), and
  • is how many rows pass the constant condition (so, less than we will examine), and
  • the actual rows_fetched to show in EXPLAIN is the number of rows in the table (== rows which we will examine), and
  • the constant condition's effect has to be moved to filter_effect for EXPLAIN.

◆ my_null_string

const String my_null_string
extern

◆ null_name_string

const Name_string null_name_string
extern