diff options
Diffstat (limited to 'sql/handler.cc')
-rw-r--r-- | sql/handler.cc | 91 |
1 files changed, 90 insertions, 1 deletions
diff --git a/sql/handler.cc b/sql/handler.cc index c4dce3caf78..977dff0b6f4 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -4035,7 +4035,7 @@ int handler::ha_repair(THD* thd, HA_CHECK_OPT* check_opt) int handler::ha_bulk_update_row(const uchar *old_data, uchar *new_data, - uint *dup_key_found) + ha_rows *dup_key_found) { DBUG_ASSERT(table_share->tmp_table != NO_TMP_TABLE || m_lock_type == F_WRLCK); @@ -6085,6 +6085,95 @@ int handler::ha_delete_row(const uchar *buf) } +/** + Execute a direct update request. A direct update request updates all + qualified rows in a single operation, rather than one row at a time. + In a Spider cluster the direct update operation is pushed down to the + child levels of the cluster. + + @param update_rows Number of updated rows. + + @retval 0 Success. + @retval != 0 Failure. +*/ + +int handler::ha_direct_update_rows(ha_rows *update_rows) +{ + int error; + + MYSQL_UPDATE_ROW_START(table_share->db.str, table_share->table_name.str); + mark_trx_read_write(); + + error = direct_update_rows(update_rows); + MYSQL_UPDATE_ROW_DONE(error); + return error; +} + + +/** + Log to the binary log the changes for a single row + in a direct update request. + + @retval 0 Success. + @retval != 0 Failure. +*/ + +int handler::ha_direct_update_row_binlog(const uchar *old_data, + uchar *new_data) +{ + Log_func *log_func= Update_rows_log_event::binlog_row_logging_function; + + /* + Some storage engines require that the new record is in record[0] + (and the old record is in record[1]). + */ + DBUG_ASSERT(new_data == table->record[0]); + + return binlog_log_row(table, old_data, new_data, log_func); +} + + +/** + Execute a direct delete request. A direct delete request deletes all + qualified rows in a single operation, rather than one row at a time. + In a Spider cluster the direct delete operation is pushed down to the + child levels of the cluster. + + @param delete_rows Number of deleted rows. + + @retval 0 Success. + @retval != 0 Failure. +*/ + +int handler::ha_direct_delete_rows(ha_rows *delete_rows) +{ + int error; + + MYSQL_DELETE_ROW_START(table_share->db.str, table_share->table_name.str); + mark_trx_read_write(); + + error = direct_delete_rows(delete_rows); + MYSQL_DELETE_ROW_DONE(error); + return error; +} + + +/** + Log to the binary log the deletion of a single row + in a direct delete request. + + @retval 0 Success. + @retval != 0 Failure. +*/ + +int handler::ha_direct_delete_row_binlog(const uchar *buf) +{ + Log_func *log_func= Delete_rows_log_event::binlog_row_logging_function; + + return binlog_log_row(table, buf, 0, log_func); +} + + /** @brief use_hidden_primary_key() is called in case of an update/delete when |