MySQL 9.1.0
Source Code Documentation
Sql_cmd_insert_base Class Reference

Base class for all INSERT and REPLACE statements. More...

#include <sql_insert.h>

Inheritance diagram for Sql_cmd_insert_base:
[legend]

Public Member Functions

 Sql_cmd_insert_base (bool is_replace_arg, enum_duplicates duplicates_arg)
 
bool accept (THD *thd, Select_lex_visitor *visitor) override
 
- Public Member Functions inherited from Sql_cmd_dml
virtual bool is_data_change_stmt () const
 
bool prepare (THD *thd) override
 Command-specific resolving (doesn't include LEX::prepare()) More...
 
bool execute (THD *thd) override
 Execute a DML statement. More...
 
enum enum_sql_cmd_type sql_cmd_type () const override
 
virtual bool may_use_cursor () const
 
bool is_single_table_plan () const override
 
Query_resultquery_result () const
 
void set_query_result (Query_result *result)
 Set query result object for this query statement. More...
 
void set_lazy_result ()
 Signal that root result object needs preparing in next execution. More...
 
bool are_dynamic_parameters_allowed () const final
 Signal that DML statement can have dynamic parameters. More...
 
- Public Member Functions inherited from Sql_cmd
virtual enum_sql_command sql_command_code () const =0
 Return the command code for this statement. More...
 
bool needs_explicit_preparation () const
 
bool is_regular () const
 
bool is_prepared () const
 
virtual bool reprepare_on_execute_required () const
 Some SQL commands currently require re-preparation on re-execution of a prepared statement or stored procedure. More...
 
virtual void cleanup (THD *)
 Command-specific reinitialization before execution of prepared statement. More...
 
void set_owner (Prepared_statement *stmt)
 Set the owning prepared statement. More...
 
Prepared_statementowner () const
 Get the owning prepared statement. More...
 
void set_as_part_of_sp ()
 Mark statement as part of procedure. More...
 
bool is_part_of_sp () const
 
virtual const MYSQL_LEX_CSTRINGeligible_secondary_storage_engine (THD *) const
 Is this statement of a type and on a form that makes it eligible for execution in a secondary storage engine? More...
 
virtual bool is_bulk_load () const
 
void disable_secondary_storage_engine ()
 Disable use of secondary storage engines in this statement. More...
 
void enable_secondary_storage_engine ()
 
bool secondary_storage_engine_disabled () const
 Has use of secondary storage engines been disabled for this statement? More...
 
void use_secondary_storage_engine (const handlerton *hton)
 Mark the current statement as using a secondary storage engine. More...
 
bool using_secondary_storage_engine () const
 Is this statement using a secondary storage engine? More...
 
const handlertonsecondary_engine () const
 Get the handlerton of the secondary engine that is used for executing this statement, or nullptr if a secondary engine is not used. More...
 
void set_optional_transform_prepared (bool value)
 
bool is_optional_transform_prepared ()
 

Public Attributes

mem_root_deque< Item * > insert_field_list
 Field list to insert/replace. More...
 
mem_root_deque< List_item * > insert_many_values
 Row data to insert/replace. More...
 
bool values_need_privilege_check {false}
 True if VALUES clause contain column references that need privilege check. More...
 
uint column_count
 Number of columns in original insert column list. More...
 
uint value_count
 Number of values per row in insert_many_values, available after resolving. More...
 
mem_root_deque< Item * > update_field_list
 ON DUPLICATE KEY UPDATE field list. More...
 
mem_root_deque< Item * > update_value_list
 ON DUPLICATE KEY UPDATE data value list. More...
 
Table_refvalues_table {nullptr}
 ON DUPLICATE KEY UPDATE reference to VALUES. More...
 
Create_col_name_listvalues_column_list {nullptr}
 
mem_root_deque< Item * > values_field_list
 Field list for VALUES derived table. More...
 
const enum_duplicates duplicates
 

Protected Member Functions

bool precheck (THD *thd) override
 Perform a precheck of table privileges for the specific operation. More...
 
bool check_privileges (THD *thd) override
 Check privileges on a prepared statement, called at start of execution of the statement. More...
 
bool prepare_inner (THD *thd) override
 Prepare items in INSERT statement. More...
 
bool restore_cmd_properties (THD *thd) override
 Restore command properties before execution. More...
 
- Protected Member Functions inherited from Sql_cmd_dml
 Sql_cmd_dml ()
 
bool is_empty_query () const
 
void set_empty_query ()
 Set statement as returning no data. More...
 
bool check_all_table_privileges (THD *thd)
 Read and check privileges for all tables in a DML statement. More...
 
virtual bool execute_inner (THD *thd)
 The inner parts of query optimization and execution. More...
 
virtual bool save_cmd_properties (THD *thd)
 Save command properties, such as prepared query details and table props. More...
 
const MYSQL_LEX_CSTRINGget_eligible_secondary_engine (THD *thd) const
 Helper function that checks if the command is eligible for secondary engine and if that's true returns the name of that eligible secondary storage engine. More...
 
- Protected Member Functions inherited from Sql_cmd
 Sql_cmd ()
 
virtual ~Sql_cmd ()
 
void set_prepared ()
 Set this statement as prepared. More...
 

Protected Attributes

const bool is_replace
 true when REPLACE statement, false when INSERT statement More...
 
- Protected Attributes inherited from Sql_cmd_dml
LEXlex
 Pointer to LEX for this statement. More...
 
Query_resultresult
 Pointer to object for handling of the result. More...
 
bool m_empty_query
 True if query will produce no rows. More...
 
bool m_lazy_result
 True: prepare query result on next execution. More...
 

Private Member Functions

bool resolve_update_expressions (THD *thd)
 Resolve ON DUPLICATE KEY UPDATE expressions. More...
 
bool prepare_values_table (THD *thd)
 Prepare the derived table created as a VALUES alias. More...
 
bool resolve_values_table_columns (THD *thd)
 Resolve the columns of the optional VALUES table to the insert_values of the table inserted into. More...
 
bool get_default_columns (THD *thd, TABLE *table, MY_BITMAP **m_function_default_columns)
 

Detailed Description

Base class for all INSERT and REPLACE statements.

Abstract class that is inherited by Sql_cmd_insert_values and Sql_cmd_insert_select.

Constructor & Destructor Documentation

◆ Sql_cmd_insert_base()

Sql_cmd_insert_base::Sql_cmd_insert_base ( bool  is_replace_arg,
enum_duplicates  duplicates_arg 
)
inlineexplicit

Member Function Documentation

◆ accept()

bool Sql_cmd_insert_base::accept ( THD thd,
Select_lex_visitor visitor 
)
overridevirtual

Reimplemented from Sql_cmd.

◆ check_privileges()

bool Sql_cmd_insert_base::check_privileges ( THD thd)
overrideprotectedvirtual

Check privileges on a prepared statement, called at start of execution of the statement.

Check that user has all relevant privileges to the statement, ie. INSERT privilege for columns inserted into, UPDATE privilege for columns that are updated, DELETE privilege for tables that are deleted from, SELECT privilege for columns that are referenced, etc.

Parameters
thdthread handler
Returns
false if success, true if false

Implements Sql_cmd_dml.

◆ get_default_columns()

bool Sql_cmd_insert_base::get_default_columns ( THD thd,
TABLE table,
MY_BITMAP **  m_function_default_columns 
)
private

◆ precheck()

bool Sql_cmd_insert_base::precheck ( THD thd)
overrideprotectedvirtual

Perform a precheck of table privileges for the specific operation.

Check that user has some relevant privileges for all tables involved in the statement, e.g. SELECT privileges for tables selected from, INSERT privileges for tables inserted into, etc. This function will also populate Table_ref::grant with all privileges the user has for each table, which is later used during checking of column privileges. Note that at preparation time, views are not expanded yet. Privilege checking is thus rudimentary and must be complemented with later calls to Query_block::check_view_privileges(). The reason to call this function at such an early stage is to be able to quickly reject statements for which the user obviously has insufficient privileges. This function is called before preparing the statement. The function must also be complemented with proper privilege checks for all involved columns (e.g. check_column_grant_*).

See also
also the function comment of Query_block::prepare(). During execution of a prepared statement, call check_privileges() instead.
Parameters
thdthread handler
Returns
false if success, true if false

Implements Sql_cmd_dml.

◆ prepare_inner()

bool Sql_cmd_insert_base::prepare_inner ( THD thd)
overrideprotectedvirtual

Prepare items in INSERT statement.

Parameters
thdThread handler

WARNING You MUST set table->insert_values to 0 after calling this function before releasing the table object.

Returns
false if success, true if error

Implements Sql_cmd_dml.

◆ prepare_values_table()

bool Sql_cmd_insert_base::prepare_values_table ( THD thd)
private

Prepare the derived table created as a VALUES alias.

When an optional table alias is specified for the VALUES of an INSERT statement, we create a derived table to contain its values. The field translation of this derived table is pointed to the insert buffer of the table we are inserting into, by means of the Item_insert_value objects we create here. An Item_insert_value object will originally contain the corresponding Item_field of the insert table, which is then cloned during its fix_field implementation to move the underlying Field to insert_values instead.

The derived table is initialized in Sql_cmd_insert_base::make_cmd, but we have to wait until after the insert table is resolved to create our field translation indirection. If the table alias is not given explicit column names in the query, it must take the column names of the insert table; this information is not available to us until the insert table is resolved.

Parameters
thdThread context.
Returns
false if success, true if error.

◆ resolve_update_expressions()

bool Sql_cmd_insert_base::resolve_update_expressions ( THD thd)
private

Resolve ON DUPLICATE KEY UPDATE expressions.

Caller is responsible for setting up the columns to be updated before calling this function.

Parameters
thdThread handler
Returns
false if success, true if error

◆ resolve_values_table_columns()

bool Sql_cmd_insert_base::resolve_values_table_columns ( THD thd)
private

Resolve the columns of the optional VALUES table to the insert_values of the table inserted into.

Field_translation of this table contains Item_insert_value objects pointing to the Item_field objects of the insert table. Caller is responsible for fixing these fields before calling this function.

Parameters
thdThread context.
Returns
false if success, true if error.

◆ restore_cmd_properties()

bool Sql_cmd_insert_base::restore_cmd_properties ( THD thd)
overrideprotectedvirtual

Restore command properties before execution.

  • Bind metadata for tables and fields
  • Restore clauses (e.g ORDER BY, GROUP BY) that were destroyed in last optimization.

Reimplemented from Sql_cmd_dml.

Member Data Documentation

◆ column_count

uint Sql_cmd_insert_base::column_count

Number of columns in original insert column list.

◆ duplicates

const enum_duplicates Sql_cmd_insert_base::duplicates

◆ insert_field_list

mem_root_deque<Item *> Sql_cmd_insert_base::insert_field_list

Field list to insert/replace.

One of two things:

  1. For the INSERT/REPLACE ... (col1, ... colN) VALUES ... syntax this is a list of col1, ..., colN fields.
  2. For the INSERT/REPLACE ... SET col1=x1, ... colM=xM syntax extension this is a list of col1, ... colM fields as well.

◆ insert_many_values

mem_root_deque<List_item *> Sql_cmd_insert_base::insert_many_values

Row data to insert/replace.

One of two things:

  1. For the INSERT/REPLACE ... VALUES (row1), (row2), ... (rowN) syntax the list contains N List_item lists: one List_item per row.
  2. For the INSERT/REPLACE ... SET col1=x1, ... colM=xM syntax extension this list contains only 1 List_item of M data values: this way we emulate this syntax: INSERT/REPLACE ... (col1, ... colM) VALUE (x1, ..., xM);

◆ is_replace

const bool Sql_cmd_insert_base::is_replace
protected

true when REPLACE statement, false when INSERT statement

◆ update_field_list

mem_root_deque<Item *> Sql_cmd_insert_base::update_field_list

ON DUPLICATE KEY UPDATE field list.

◆ update_value_list

mem_root_deque<Item *> Sql_cmd_insert_base::update_value_list

ON DUPLICATE KEY UPDATE data value list.

◆ value_count

uint Sql_cmd_insert_base::value_count

Number of values per row in insert_many_values, available after resolving.

◆ values_column_list

Create_col_name_list* Sql_cmd_insert_base::values_column_list {nullptr}

◆ values_field_list

mem_root_deque<Item *> Sql_cmd_insert_base::values_field_list

Field list for VALUES derived table.

If no insert_field exists (e.g. INSERT INTO t0 ..), we have to create one to create Item_insert_values for ODKU statements.

◆ values_need_privilege_check

bool Sql_cmd_insert_base::values_need_privilege_check {false}

True if VALUES clause contain column references that need privilege check.

◆ values_table

Table_ref* Sql_cmd_insert_base::values_table {nullptr}

ON DUPLICATE KEY UPDATE reference to VALUES.

. as a derived table.


The documentation for this class was generated from the following files: