diff options
Diffstat (limited to 'storage/innobase/handler/ha_innopart.h')
-rw-r--r-- | storage/innobase/handler/ha_innopart.h | 1315 |
1 files changed, 0 insertions, 1315 deletions
diff --git a/storage/innobase/handler/ha_innopart.h b/storage/innobase/handler/ha_innopart.h deleted file mode 100644 index 67db9e07150..00000000000 --- a/storage/innobase/handler/ha_innopart.h +++ /dev/null @@ -1,1315 +0,0 @@ -/***************************************************************************** - -Copyright (c) 2014, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2016, MariaDB Corporation. - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; version 2 of the License. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA - -*****************************************************************************/ - -/* The InnoDB Partition handler: the interface between MySQL and InnoDB. */ - -#ifndef ha_innopart_h -#define ha_innopart_h - -#include "partitioning/partition_handler.h" - -/* Forward declarations */ -class Altered_partitions; -class partition_info; - -/** HA_DUPLICATE_POS and HA_READ_BEFORE_WRITE_REMOVAL is not -set from ha_innobase, but cannot yet be supported in ha_innopart. -Full text and geometry is not yet supported. */ -const handler::Table_flags HA_INNOPART_DISABLED_TABLE_FLAGS = - ( HA_CAN_FULLTEXT - | HA_CAN_FULLTEXT_EXT - | HA_CAN_GEOMETRY - | HA_DUPLICATE_POS - | HA_READ_BEFORE_WRITE_REMOVAL); - -/** InnoDB partition specific Handler_share. */ -class Ha_innopart_share : public Partition_share -{ -private: - /** Array of all included table definitions (one per partition). */ - dict_table_t** m_table_parts; - - /** Instead of INNOBASE_SHARE::idx_trans_tbl. Maps MySQL index number - to InnoDB index per partition. */ - dict_index_t** m_index_mapping; - - /** Total number of partitions. */ - uint m_tot_parts; - - /** Number of indexes. */ - uint m_index_count; - - /** Reference count. */ - uint m_ref_count; - - /** Pointer back to owning TABLE_SHARE. */ - TABLE_SHARE* m_table_share; - -public: - Ha_innopart_share( - TABLE_SHARE* table_share); - - ~Ha_innopart_share(); - - /** Set innodb table for given partition. - @param[in] part_id Partition number. - @param[in] table Table. */ - inline - void - set_table_part( - uint part_id, - dict_table_t* table) - { - ut_ad(m_table_parts != NULL); - ut_ad(part_id < m_tot_parts); - m_table_parts[part_id] = table; - } - - /** Return innodb table for given partition. - @param[in] part_id Partition number. - @return InnoDB table. */ - inline - dict_table_t* - get_table_part( - uint part_id) const - { - ut_ad(m_table_parts != NULL); - ut_ad(part_id < m_tot_parts); - return(m_table_parts[part_id]); - } - - /** Return innodb index for given partition and key number. - @param[in] part_id Partition number. - @param[in] keynr Key number. - @return InnoDB index. */ - dict_index_t* - get_index( - uint part_id, - uint keynr); - - /** Get MySQL key number corresponding to InnoDB index. - @param[in] part_id Partition number. - @param[in] index InnoDB index. - @return MySQL key number or MAX_KEY if non-existent. */ - uint - get_mysql_key( - uint part_id, - const dict_index_t* index); - - /** Initialize the share with table and indexes per partition. - @param[in] part_info Partition info (partition names to use) - @param[in] table_name Table name (db/table_name) - @return false on success else true. */ - bool - open_table_parts( - partition_info* part_info, - const char* table_name); - - /** Close the table partitions. - If all instances are closed, also release the resources. */ - void - close_table_parts(); - - /* Static helper functions. */ - /** Fold to lower case if windows or lower_case_table_names == 1. - @param[in,out] s String to fold.*/ - static - void - partition_name_casedn_str( - char* s); - - /** Translate and append partition name. - @param[out] to String to write in filesystem charset - @param[in] from Name in system charset - @param[in] sep Separator - @param[in] len Max length of to buffer - @return length of written string. */ - static - size_t - append_sep_and_name( - char* to, - const char* from, - const char* sep, - size_t len); - - /** Set up the virtual column template for partition table, and points - all m_table_parts[]->vc_templ to it. - @param[in] table MySQL TABLE object - @param[in] ib_table InnoDB dict_table_t - @param[in] table_name Table name (db/table_name) */ - void - set_v_templ( - TABLE* table, - dict_table_t* ib_table, - const char* name); - -private: - /** Disable default constructor. */ - Ha_innopart_share() {}; - - /** Open one partition (lower lever innodb table). - @param[in] part_id Partition to open. - @param[in] partition_name Name of partition. - @return false on success else true. */ - bool - open_one_table_part( - uint part_id, - const char* partition_name); -}; - -/** The class defining a partitioning aware handle to an InnoDB table. -Based on ha_innobase and extended with -- Partition_helper for re-using common partitioning functionality -- Partition_handler for providing partitioning specific api calls. -Generic partitioning functions are implemented in Partition_helper. -Lower level storage functions are implemented in ha_innobase. -Partition_handler is inherited for implementing the handler level interface -for partitioning specific functions, like change_partitions and -truncate_partition. -InnoDB specific functions related to partitioning is implemented here. */ -class ha_innopart: - public ha_innobase, - public Partition_helper, - public Partition_handler -{ -public: - ha_innopart( - handlerton* hton, - TABLE_SHARE* table_arg); - - ~ha_innopart(); - - /** Clone this handler, used when needing more than one cursor - to the same table. - @param[in] name Table name. - @param[in] mem_root mem_root to allocate from. - @retval Pointer to clone or NULL if error. */ - handler* - clone( - const char* name, - MEM_ROOT* mem_root); - - /** Check and register a table in the query cache. - Ask InnoDB if a query to a table can be cached. - @param[in] thd User thread handle. - @param[in] table_key Normalized path to the table. - @param[in] key_length Lenght of table_key. - @param[out] call_back Function pointer for checking if data - has changed. - @param[in,out] engine_data Data for call_back (not used). - @return TRUE if query caching of the table is permitted. */ - my_bool - register_query_cache_table( - THD* thd, - char* table_key, - size_t key_length, - qc_engine_callback* call_back, - ulonglong* engine_data) - { - /* Currently this would need to go through every - [sub] partition in the table to see if any of them has changed. - See row_search_check_if_query_cache_permitted(). - So disabled until we can avoid check all partitions. */ - return(FALSE); - } - - /** On-line ALTER TABLE interface @see handler0alter.cc @{ */ - - /** Check if InnoDB supports a particular alter table in-place. - @param[in] altered_table TABLE object for new version of table. - @param[in,out] ha_alter_info Structure describing changes to be done - by ALTER TABLE and holding data used during in-place alter. - @retval HA_ALTER_INPLACE_NOT_SUPPORTED Not supported - @retval HA_ALTER_INPLACE_NO_LOCK Supported - @retval HA_ALTER_INPLACE_SHARED_LOCK_AFTER_PREPARE Supported, but - requires lock during main phase and exclusive lock during prepare - phase. - @retval HA_ALTER_INPLACE_NO_LOCK_AFTER_PREPARE Supported, prepare - phase requires exclusive lock. */ - enum_alter_inplace_result - check_if_supported_inplace_alter( - TABLE* altered_table, - Alter_inplace_info* ha_alter_info); - - /** Prepare in-place ALTER for table. - Allows InnoDB to update internal structures with concurrent - writes blocked (provided that check_if_supported_inplace_alter() - did not return HA_ALTER_INPLACE_NO_LOCK). - This will be invoked before inplace_alter_table(). - @param[in] altered_table TABLE object for new version of table. - @param[in,out] ha_alter_info Structure describing changes to be done - by ALTER TABLE and holding data used during in-place alter. - @retval true Failure. - @retval false Success. */ - bool - prepare_inplace_alter_table( - TABLE* altered_table, - Alter_inplace_info* ha_alter_info); - - /** Alter the table structure in-place. - Alter the table structure in-place with operations - specified using HA_ALTER_FLAGS and Alter_inplace_information. - The level of concurrency allowed during this operation depends - on the return value from check_if_supported_inplace_alter(). - @param[in] altered_table TABLE object for new version of table. - @param[in,out] ha_alter_info Structure describing changes to be done - by ALTER TABLE and holding data used during in-place alter. - @retval true Failure. - @retval false Success. */ - bool - inplace_alter_table( - TABLE* altered_table, - Alter_inplace_info* ha_alter_info); - - /** Commit or rollback. - Commit or rollback the changes made during - prepare_inplace_alter_table() and inplace_alter_table() inside - the storage engine. Note that the allowed level of concurrency - during this operation will be the same as for - inplace_alter_table() and thus might be higher than during - prepare_inplace_alter_table(). (E.g concurrent writes were - blocked during prepare, but might not be during commit). - @param[in] altered_table TABLE object for new version of table. - @param[in] ha_alter_info Structure describing changes to be done - by ALTER TABLE and holding data used during in-place alter. - @param[in,out] commit true => Commit, false => Rollback. - @retval true Failure. - @retval false Success. */ - bool - commit_inplace_alter_table( - TABLE* altered_table, - Alter_inplace_info* ha_alter_info, - bool commit); - - /** Notify the storage engine that the table structure (.frm) has - been updated. - - ha_partition allows inplace operations that also upgrades the engine - if it supports partitioning natively. So if this is the case then - we will remove the .par file since it is not used with ha_innopart - (we use the internal data dictionary instead). */ - void - notify_table_changed(); - /** @} */ - - // TODO: should we implement init_table_handle_for_HANDLER() ? - // (or is sql_stat_start handled correctly anyway?) - int - optimize( - THD* thd, - HA_CHECK_OPT* check_opt); - - int - discard_or_import_tablespace( - my_bool discard); - - /** Compare key and rowid. - Helper function for sorting records in the priority queue. - a/b points to table->record[0] rows which must have the - key fields set. The bytes before a and b store the rowid. - This is used for comparing/sorting rows first according to - KEY and if same KEY, by rowid (ref). - - @param[in] key_info Null terminated array of index - information. - @param[in] a Pointer to record+ref in first record. - @param[in] b Pointer to record+ref in second record. - @return Return value is SIGN(first_rec - second_rec) - @retval 0 Keys are equal. - @retval -1 second_rec is greater than first_rec. - @retval +1 first_rec is greater than second_rec. */ - static - int - key_and_rowid_cmp( - KEY** key_info, - uchar *a, - uchar *b); - - int - extra( - enum ha_extra_function operation); - - void - print_error( - int error, - myf errflag); - - bool - is_ignorable_error( - int error); - - int - start_stmt( - THD* thd, - thr_lock_type lock_type); - - ha_rows - records_in_range( - uint inx, - key_range* min_key, - key_range* max_key); - - ha_rows - estimate_rows_upper_bound(); - - uint - alter_table_flags( - uint flags); - - void - update_create_info( - HA_CREATE_INFO* create_info); - - int - create( - const char* name, - TABLE* form, - HA_CREATE_INFO* create_info); - - int - truncate(); - - int - check( - THD* thd, - HA_CHECK_OPT* check_opt); - - /** Repair table. - Will only handle records in wrong partition, not repairing - corrupt innodb indexes. - @param[in] thd Thread context. - @param[in] repair_opt Repair options. - @return 0 or error code. */ - int - repair( - THD* thd, - HA_CHECK_OPT* repair_opt); - - bool - can_switch_engines(); - - uint - referenced_by_foreign_key(); - - void - get_auto_increment( - ulonglong offset, - ulonglong increment, - ulonglong nb_desired_values, - ulonglong* first_value, - ulonglong* nb_reserved_values); - - int - cmp_ref( - const uchar* ref1, - const uchar* ref2); - - int - read_range_first( - const key_range* start_key, - const key_range* end_key, - bool eq_range_arg, - bool sorted) - { - return(Partition_helper::ph_read_range_first( - start_key, - end_key, - eq_range_arg, - sorted)); - } - - void - position( - const uchar* record) - { - Partition_helper::ph_position(record); - } - - int - rnd_pos_by_record( - uchar* record) - { - return(Partition_helper::ph_rnd_pos_by_record(record)); - } - - /* TODO: Implement these! */ - bool - check_if_incompatible_data( - HA_CREATE_INFO* info, - uint table_changes) - { - ut_ad(0); - return(COMPATIBLE_DATA_NO); - } - - int - delete_all_rows() - { - return(handler::delete_all_rows()); - } - - int - disable_indexes( - uint mode) - { - return(HA_ERR_WRONG_COMMAND); - } - - int - enable_indexes( - uint mode) - { - return(HA_ERR_WRONG_COMMAND); - } - - void - free_foreign_key_create_info( - char* str) - { - ut_ad(0); - } - - int - ft_init() - { - ut_ad(0); - return(HA_ERR_WRONG_COMMAND); - } - - FT_INFO* - ft_init_ext( - uint flags, - uint inx, - String* key) - { - ut_ad(0); - return(NULL); - } - - FT_INFO* - ft_init_ext_with_hints( - uint inx, - String* key, - Ft_hints* hints) - { - ut_ad(0); - return(NULL); - } - - int - ft_read( - uchar* buf) - { - ut_ad(0); - return(HA_ERR_WRONG_COMMAND); - } - - bool - get_foreign_dup_key( - char* child_table_name, - uint child_table_name_len, - char* child_key_name, - uint child_key_name_len) - { - ut_ad(0); - return(false); - } - - // TODO: not yet supporting FK. - char* - get_foreign_key_create_info() - { - return(NULL); - } - - // TODO: not yet supporting FK. - int - get_foreign_key_list( - THD* thd, - List<FOREIGN_KEY_INFO>* f_key_list) - { - return(0); - } - - // TODO: not yet supporting FK. - int - get_parent_foreign_key_list( - THD* thd, - List<FOREIGN_KEY_INFO>* f_key_list) - { - return(0); - } - - // TODO: not yet supporting FK. - int - get_cascade_foreign_key_table_list( - THD* thd, - List<st_handler_tablename>* fk_table_list) - { - return(0); - } - - int - read_range_next() - { - return(Partition_helper::ph_read_range_next()); - } - - uint32 - calculate_key_hash_value( - Field** field_array) - { - return(Partition_helper::ph_calculate_key_hash_value(field_array)); - } - - Table_flags - table_flags() const - { - return(ha_innobase::table_flags() | HA_CAN_REPAIR); - } - - void - release_auto_increment() - { - Partition_helper::ph_release_auto_increment(); - } - - /** Implementing Partition_handler interface @see partition_handler.h - @{ */ - - /** See Partition_handler. */ - void - get_dynamic_partition_info( - ha_statistics* stat_info, - ha_checksum* check_sum, - uint part_id) - { - Partition_helper::get_dynamic_partition_info_low( - stat_info, - check_sum, - part_id); - } - - uint - alter_flags( - uint flags MY_ATTRIBUTE((unused))) const - { - return(HA_PARTITION_FUNCTION_SUPPORTED - | HA_FAST_CHANGE_PARTITION); - } - - Partition_handler* - get_partition_handler() - { - return(static_cast<Partition_handler*>(this)); - } - - void - set_part_info( - partition_info* part_info, - bool early) - { - Partition_helper::set_part_info_low(part_info, early); - } - - void - initialize_partitioning( - partition_info* part_info, - bool early) - { - Partition_helper::set_part_info_low(part_info, early); - } - - handler* - get_handler() - { - return(static_cast<handler*>(this)); - } - /** @} */ - -private: - /** Pointer to Ha_innopart_share on the TABLE_SHARE. */ - Ha_innopart_share* m_part_share; - - /** ins_node per partition. Synchronized with prebuilt->ins_node - when changing partitions. */ - ins_node_t** m_ins_node_parts; - - /** upd_node per partition. Synchronized with prebuilt->upd_node - when changing partitions. */ - upd_node_t** m_upd_node_parts; - - /** blob_heap per partition. Synchronized with prebuilt->blob_heap - when changing partitions. */ - mem_heap_t** m_blob_heap_parts; - - /** trx_id from the partitions table->def_trx_id. Keep in sync - with prebuilt->trx_id when changing partitions. - prebuilt only reflects the current partition! */ - trx_id_t* m_trx_id_parts; - - /** row_read_type per partition. */ - ulint* m_row_read_type_parts; - - /** sql_stat_start per partition. */ - uchar* m_sql_stat_start_parts; - - /** persistent cursors per partition. */ - btr_pcur_t* m_pcur_parts; - - /** persistent cluster cursors per partition. */ - btr_pcur_t* m_clust_pcur_parts; - - /** map from part_id to offset in above two arrays. */ - uint16_t* m_pcur_map; - - /** Original m_prebuilt->pcur. */ - btr_pcur_t* m_pcur; - - /** Original m_prebuilt->clust_pcur. */ - btr_pcur_t* m_clust_pcur; - - /** New partitions during ADD/REORG/... PARTITION. */ - Altered_partitions* m_new_partitions; - - /** Clear used ins_nodes and upd_nodes. */ - void - clear_ins_upd_nodes(); - - /** Clear the blob heaps for all partitions */ - void - clear_blob_heaps(); - - /** Reset state of file to after 'open'. This function is called - after every statement for all tables used by that statement. */ - int - reset(); - - /** Allocate the array to hold blob heaps for all partitions */ - mem_heap_t** - alloc_blob_heap_array(); - - /** Free the array that holds blob heaps for all partitions */ - void - free_blob_heap_array(); - - /** Changes the active index of a handle. - @param[in] part_id Use this partition. - @param[in] keynr Use this index; MAX_KEY means always - clustered index, even if it was internally generated by InnoDB. - @return 0 or error code. */ - int - change_active_index( - uint part_id, - uint keynr); - - /** Move to next partition and set its index. - @return 0 for success else error number. */ - int - next_partition_index(); - - /** Get the index for the current partition - @param[in] keynr MySQL index number. - @return InnoDB index or NULL. */ - dict_index_t* - innobase_get_index( - uint keynr); - - /** Get the index for a handle. - Does not change active index. - @param[in] keynr use this index; MAX_KEY means always clustered - index, even if it was internally generated by InnoDB. - @param[in] part_id From this partition. - @return NULL or index instance. */ - dict_index_t* - innopart_get_index( - uint part_id, - uint keynr); - - /** Change active partition. - Copies needed info into m_prebuilt from the partition specific memory. - @param[in] part_id Partition to set as active. */ - void - set_partition( - uint part_id); - - /** Update active partition. - Copies needed info from m_prebuilt into the partition specific memory. - @param[in] part_id Partition to set as active. */ - void - update_partition( - uint part_id); - - /** Helpers needed by Partition_helper, @see partition_handler.h @{ */ - - /** Set the autoinc column max value. - This should only be called once from ha_innobase::open(). - Therefore there's no need for a covering lock. - @param[in] no_lock If locking should be skipped. Not used! - @return 0 on success else error code. */ - int - initialize_auto_increment( - bool /* no_lock */); - - /** Setup the ordered record buffer and the priority queue. - @param[in] used_parts Number of used partitions in query. - @return false for success, else true. */ - int - init_record_priority_queue_for_parts( - uint used_parts); - - /** Destroy the ordered record buffer and the priority queue. */ - void - destroy_record_priority_queue_for_parts(); - - /** Prepare for creating new partitions during ALTER TABLE ... - PARTITION. - @param[in] num_partitions Number of new partitions to be created. - @param[in] only_create True if only creating the partition - (no open/lock is needed). - @return 0 for success else error code. */ - int - prepare_for_new_partitions( - uint num_partitions, - bool only_create); - - /** Create a new partition to be filled during ALTER TABLE ... - PARTITION. - @param[in] table Table to create the partition in. - @param[in] create_info Table/partition specific create info. - @param[in] part_name Partition name. - @param[in] new_part_id Partition id in new table. - @param[in] part_elem Partition element. - @return 0 for success else error code. */ - int - create_new_partition( - TABLE* table, - HA_CREATE_INFO* create_info, - const char* part_name, - uint new_part_id, - partition_element* part_elem); - - /** Close and finalize new partitions. */ - void - close_new_partitions(); - - /** write row to new partition. - @param[in] new_part New partition to write to. - @return 0 for success else error code. */ - int - write_row_in_new_part( - uint new_part); - - /** Write a row in specific partition. - Stores a row in an InnoDB database, to the table specified in this - handle. - @param[in] part_id Partition to write to. - @param[in] row A row in MySQL format. - @return error code. */ - int - write_row_in_part( - uint part_id, - uchar* row); - - /** Update a row in partition. - Updates a row given as a parameter to a new value. - @param[in] part_id Partition to update row in. - @param[in] old_row Old row in MySQL format. - @param[in] new_row New row in MySQL format. - @return error number or 0. */ - int - update_row_in_part( - uint part_id, - const uchar* old_row, - uchar* new_row); - - /** Deletes a row in partition. - @param[in] part_id Partition to delete from. - @param[in] row Row to delete in MySQL format. - @return error number or 0. */ - int - delete_row_in_part( - uint part_id, - const uchar* row); - - /** Return first record in index from a partition. - @param[in] part Partition to read from. - @param[out] record First record in index in the partition. - @return error number or 0. */ - int - index_first_in_part( - uint part, - uchar* record); - - /** Return last record in index from a partition. - @param[in] part Partition to read from. - @param[out] record Last record in index in the partition. - @return error number or 0. */ - int - index_last_in_part( - uint part, - uchar* record); - - /** Return previous record in index from a partition. - @param[in] part Partition to read from. - @param[out] record Last record in index in the partition. - @return error number or 0. */ - int - index_prev_in_part( - uint part, - uchar* record); - - /** Return next record in index from a partition. - @param[in] part Partition to read from. - @param[out] record Last record in index in the partition. - @return error number or 0. */ - int - index_next_in_part( - uint part, - uchar* record); - - /** Return next same record in index from a partition. - This routine is used to read the next record, but only if the key is - the same as supplied in the call. - @param[in] part Partition to read from. - @param[out] record Last record in index in the partition. - @param[in] key Key to match. - @param[in] length Length of key. - @return error number or 0. */ - int - index_next_same_in_part( - uint part, - uchar* record, - const uchar* key, - uint length); - - /** Start index scan and return first record from a partition. - This routine starts an index scan using a start key. The calling - function will check the end key on its own. - @param[in] part Partition to read from. - @param[out] record First matching record in index in the partition. - @param[in] key Key to match. - @param[in] keypart_map Which part of the key to use. - @param[in] find_flag Key condition/direction to use. - @return error number or 0. */ - int - index_read_map_in_part( - uint part, - uchar* record, - const uchar* key, - key_part_map keypart_map, - enum ha_rkey_function find_flag); - - /** Return last matching record in index from a partition. - @param[in] part Partition to read from. - @param[out] record Last matching record in index in the partition. - @param[in] key Key to match. - @param[in] keypart_map Which part of the key to use. - @return error number or 0. */ - int - index_read_last_map_in_part( - uint part, - uchar* record, - const uchar* key, - key_part_map keypart_map); - - /** Start index scan and return first record from a partition. - This routine starts an index scan using a start and end key. - @param[in] part Partition to read from. - @param[out] record First matching record in index in the partition. - if NULL use table->record[0] as return buffer. - @param[in] start_key Start key to match. - @param[in] end_key End key to match. - @param[in] eq_range Is equal range, start_key == end_key. - @param[in] sorted Return rows in sorted order. - @return error number or 0. */ - int - read_range_first_in_part( - uint part, - uchar* record, - const key_range* start_key, - const key_range* end_key, - bool eq_range, - bool sorted); - - /** Return next record in index range scan from a partition. - @param[in] part Partition to read from. - @param[out] record First matching record in index in the partition. - if NULL use table->record[0] as return buffer. - @return error number or 0. */ - int - read_range_next_in_part( - uint part, - uchar* record); - - /** Start index scan and return first record from a partition. - This routine starts an index scan using a start key. The calling - function will check the end key on its own. - @param[in] part Partition to read from. - @param[out] record First matching record in index in the partition. - @param[in] index Index to read from. - @param[in] key Key to match. - @param[in] keypart_map Which part of the key to use. - @param[in] find_flag Key condition/direction to use. - @return error number or 0. */ - int - index_read_idx_map_in_part( - uint part, - uchar* record, - uint index, - const uchar* key, - key_part_map keypart_map, - enum ha_rkey_function find_flag); - - /** Initialize random read/scan of a specific partition. - @param[in] part_id Partition to initialize. - @param[in] table_scan True for scan else random access. - @return error number or 0. */ - int - rnd_init_in_part( - uint part_id, - bool table_scan); - - /** Get next row during scan of a specific partition. - @param[in] part_id Partition to read from. - @param[out] record Next row. - @return error number or 0. */ - int - rnd_next_in_part( - uint part_id, - uchar* record); - - /** End random read/scan of a specific partition. - @param[in] part_id Partition to end random read/scan. - @param[in] table_scan True for scan else random access. - @return error number or 0. */ - int - rnd_end_in_part( - uint part_id, - bool table_scan); - - /** Get a reference to the current cursor position in the last used - partition. - @param[out] ref Reference (PK if exists else row_id). - @param[in] record Record to position. */ - void - position_in_last_part( - uchar* ref, - const uchar* record); - - /** Read record by given record (by its PK) from the last used partition. - see handler::rnd_pos_by_record(). - @param[in,out] record Record to position. - @return 0 or error number. */ - int - rnd_pos_by_record_in_last_part( - uchar* record) - { - /* Not much overhead to use default function. - This avoids out-of-sync code. */ - return(handler::rnd_pos_by_record(record)); - } - - /** Copy a cached MySQL record. - @param[out] to_record Where to copy the MySQL record. - @param[in] from_record Which record to copy. */ - void - copy_cached_row( - uchar* to_record, - const uchar* from_record); - /** @} */ - - /* Private handler:: functions specific for native InnoDB partitioning. - @see handler.h @{ */ - - int - open( - const char* name, - int mode, - uint test_if_locked); - - int - close(); - - double - scan_time(); - - /** Was the last returned row semi consistent read. - In an UPDATE or DELETE, if the row under the cursor was locked by - another transaction, and the engine used an optimistic read of the last - committed row value under the cursor, then the engine returns 1 from - this function. MySQL must NOT try to update this optimistic value. If - the optimistic value does not match the WHERE condition, MySQL can - decide to skip over this row. This can be used to avoid unnecessary - lock waits. - - If this method returns true, it will also signal the storage - engine that the next read will be a locking re-read of the row. - @see handler.h and row0mysql.h - @return true if last read was semi consistent else false. */ - bool was_semi_consistent_read(); - - /** Try semi consistent read. - Tell the engine whether it should avoid unnecessary lock waits. - If yes, in an UPDATE or DELETE, if the row under the cursor was locked - by another transaction, the engine may try an optimistic read of - the last committed row value under the cursor. - @see handler.h and row0mysql.h - @param[in] yes Should semi-consistent read be used. */ - void try_semi_consistent_read( - bool yes); - - /** Removes a lock on a row. - Removes a new lock set on a row, if it was not read optimistically. - This can be called after a row has been read in the processing of - an UPDATE or a DELETE query. @see ha_innobase::unlock_row(). */ - void unlock_row(); - - int - index_init( - uint index, - bool sorted); - - int - index_end(); - - int - rnd_init( - bool scan) - { - return(Partition_helper::ph_rnd_init(scan)); - } - - int - rnd_end() - { - return(Partition_helper::ph_rnd_end()); - } - - int - external_lock( - THD* thd, - int lock_type); - - THR_LOCK_DATA** - store_lock( - THD* thd, - THR_LOCK_DATA** to, - thr_lock_type lock_type); - - int - write_row( - uchar* record) - { - return(Partition_helper::ph_write_row(record)); - } - - int - update_row( - const uchar* old_record, - uchar* new_record) - { - return(Partition_helper::ph_update_row(old_record, new_record)); - } - - int - delete_row( - const uchar* record) - { - return(Partition_helper::ph_delete_row(record)); - } - /** @} */ - - /** Truncate partition. - Called from Partition_handler::trunctate_partition(). */ - int - truncate_partition_low(); - - /** Change partitions according to ALTER TABLE ... PARTITION ... - Called from Partition_handler::change_partitions(). - @param[in] create_info Table create info. - @param[in] path Path including db/table_name. - @param[out] copied Number of copied rows. - @param[out] deleted Number of deleted rows. - @return 0 for success or error code. */ - int - change_partitions_low( - HA_CREATE_INFO* create_info, - const char* path, - ulonglong* const copied, - ulonglong* const deleted) - { - return(Partition_helper::change_partitions( - create_info, - path, - copied, - deleted)); - } - - /** Access methods to protected areas in handler to avoid adding - friend class Partition_helper in class handler. - @see partition_handler.h @{ */ - - THD* - get_thd() const - { - return ha_thd(); - } - - TABLE* - get_table() const - { - return table; - } - - bool - get_eq_range() const - { - return eq_range; - } - - void - set_eq_range(bool eq_range_arg) - { - eq_range= eq_range_arg; - } - - void - set_range_key_part(KEY_PART_INFO *key_part) - { - range_key_part= key_part; - } - /** @} */ - - /** Fill in data_dir_path and tablespace name from internal data - dictionary. - @param part_elem Partition element to fill. - @param ib_table InnoDB table to copy from. */ - void - update_part_elem( - partition_element* part_elem, - dict_table_t* ib_table); -protected: - /* Protected handler:: functions specific for native InnoDB partitioning. - @see handler.h @{ */ - - int - rnd_next( - uchar* record) - { - return(Partition_helper::ph_rnd_next(record)); - } - - int - rnd_pos( - uchar* record, - uchar* pos); - - int - index_next( - uchar* record) - { - return(Partition_helper::ph_index_next(record)); - } - - int - index_next_same( - uchar* record, - const uchar* key, - uint keylen) - { - return(Partition_helper::ph_index_next_same(record, key, keylen)); - } - - int - index_prev( - uchar* record) - { - return(Partition_helper::ph_index_prev(record)); - } - - int - index_first( - uchar* record) - { - return(Partition_helper::ph_index_first(record)); - } - - int - index_last( - uchar* record) - { - return(Partition_helper::ph_index_last(record)); - } - - int - index_read_last_map( - uchar* record, - const uchar* key, - key_part_map keypart_map) - { - return(Partition_helper::ph_index_read_last_map( - record, - key, - keypart_map)); - } - - int - index_read_map( - uchar* buf, - const uchar* key, - key_part_map keypart_map, - enum ha_rkey_function find_flag) - { - return(Partition_helper::ph_index_read_map( - buf, - key, - keypart_map, - find_flag)); - } - - int - index_read_idx_map( - uchar* buf, - uint index, - const uchar* key, - key_part_map keypart_map, - enum ha_rkey_function find_flag) - { - return(Partition_helper::ph_index_read_idx_map( - buf, - index, - key, - keypart_map, - find_flag)); - } - /** @} */ - - /** Updates and return statistics. - Returns statistics information of the table to the MySQL interpreter, - in various fields of the handle object. - @param[in] flag Flags for what to update and return. - @param[in] is_analyze True if called from ::analyze(). - @return HA_ERR_* error code or 0. */ - int - info_low( - uint flag, - bool is_analyze); -}; -#endif /* ha_innopart_h */ |