diff options
Diffstat (limited to 'sql/sql_update.h')
-rw-r--r-- | sql/sql_update.h | 89 |
1 files changed, 77 insertions, 12 deletions
diff --git a/sql/sql_update.h b/sql/sql_update.h index 65e44d112a4..bd7d58cf97d 100644 --- a/sql/sql_update.h +++ b/sql/sql_update.h @@ -17,6 +17,8 @@ #define SQL_UPDATE_INCLUDED #include "sql_class.h" /* enum_duplicates */ +#include "sql_cmd.h" // Sql_cmd_dml +#include "sql_base.h" class Item; struct TABLE_LIST; @@ -25,20 +27,83 @@ class THD; typedef class st_select_lex SELECT_LEX; typedef class st_select_lex_unit SELECT_LEX_UNIT; -bool mysql_prepare_update(THD *thd, TABLE_LIST *table_list, - Item **conds, uint order_num, ORDER *order); bool check_unique_table(THD *thd, TABLE_LIST *table_list); -int mysql_update(THD *thd,TABLE_LIST *tables,List<Item> &fields, - List<Item> &values,COND *conds, - uint order_num, ORDER *order, ha_rows limit, - bool ignore, ha_rows *found_return, ha_rows *updated_return); -bool mysql_multi_update(THD *thd, TABLE_LIST *table_list, - List<Item> *fields, List<Item> *values, - COND *conds, ulonglong options, - enum enum_duplicates handle_duplicates, bool ignore, - SELECT_LEX_UNIT *unit, SELECT_LEX *select_lex, - multi_update **result); bool records_are_comparable(const TABLE *table); bool compare_record(const TABLE *table); +/** + @class Sql_cmd_update - class used for any UPDATE statements + + This class is derived from Sql_cmd_dml and contains implementations + for abstract virtual function of the latter such as precheck() and + prepare_inner(). It also overrides the implementation of execute_inner() + providing a special handling for single-table update statements that + are not converted to multi-table updates. + The class provides an object of the Multiupdate_prelocking_strategy class + for the virtual function get_dml_prelocking_strategy(). +*/ +class Sql_cmd_update final : public Sql_cmd_dml +{ +public: + Sql_cmd_update(bool multitable_arg) + : orig_multitable(multitable_arg), multitable(multitable_arg) + {} + + enum_sql_command sql_command_code() const override + { + return orig_multitable ? SQLCOM_UPDATE_MULTI : SQLCOM_UPDATE; + } + + DML_prelocking_strategy *get_dml_prelocking_strategy() + { + return &multiupdate_prelocking_strategy; + } + + bool processing_as_multitable_update_prohibited(THD *thd); + + bool is_multitable() { return multitable; } + + void set_as_multitable() { multitable= true; } + +protected: + /** + @brief Perform precheck of table privileges for update statements + */ + bool precheck(THD *thd) override; + + /** + @brief Perform context analysis for update statements + */ + bool prepare_inner(THD *thd) override; + + /** + @brief Perform optimization and execution actions needed for updates + */ + bool execute_inner(THD *thd) override; + +private: + + /** + @brief Special handling of single-table updates after prepare phase + */ + bool update_single_table(THD *thd); + + /* Original value of the 'multitable' flag set by constructor */ + const bool orig_multitable; + + /* + True if the statement is a multi-table update or converted to such. + For a single-table update this flag is set to true if the statement + is supposed to be converted to multi-table update. + */ + bool multitable; + + /* The prelocking strategy used when opening the used tables */ + Multiupdate_prelocking_strategy multiupdate_prelocking_strategy; + + public: + /* The list of the updating expressions used in the set clause */ + List<Item> *update_value_list; +}; + #endif /* SQL_UPDATE_INCLUDED */ |