From: Marc Alff Date: May 25 2010 8:20am Subject: bzr push into mysql-next-mr-wl4895 branch (marc.alff:3150 to 3151) WL#4895 List-Archive: http://lists.mysql.com/commits/109131 Message-Id: <201005250822.o4P2kE4U008908@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4488897287976283659==" --===============4488897287976283659== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3151 Marc Alff 2010-05-25 WL#4895 PERFORMANCE SCHEMA TABLE IO Implemented code review comments: - move the implementation of handler::ha_rnd_next() and related to handler.cc - add instrumentation for rnd_pos modified: mysql-test/suite/perfschema/r/myisam_table_io.result sql/filesort.cc sql/ha_partition.cc sql/handler.cc sql/handler.h sql/log_event.cc sql/log_event_old.cc sql/opt_range.cc sql/records.cc sql/sql_insert.cc sql/sql_select.cc sql/sql_update.cc 3150 Marc Alff 2010-05-20 [merge] Merge mysql-next-mr --> mysql-next-mr-wl4895 added: include/waiting_threads.h mysql-test/suite/funcs_1/r/row_count_func.result mysql-test/suite/funcs_1/t/row_count_func-master.opt mysql-test/suite/funcs_1/t/row_count_func.test mysql-test/suite/rpl/r/rpl_show_master_info_file.result mysql-test/suite/rpl/t/rpl_show_master_info_file-master.opt mysql-test/suite/rpl/t/rpl_show_master_info_file.test mysys/waiting_threads.c unittest/mysys/waiting_threads-t.c modified: BUILD/Makefile.am CMakeLists.txt Docs/Makefile.am Makefile.am client/Makefile.am cmake/build_configurations/mysql_release.cmake cmake/install_layout.cmake cmake/install_macros.cmake cmake/mysql_version.cmake cmake/plugin.cmake cmd-line-utils/Makefile.am cmd-line-utils/readline/Makefile.am config.h.cmake extra/Makefile.am extra/yassl/Makefile.am extra/yassl/src/Makefile.am extra/yassl/taocrypt/Makefile.am extra/yassl/taocrypt/benchmark/Makefile.am extra/yassl/taocrypt/src/Makefile.am extra/yassl/taocrypt/test/Makefile.am extra/yassl/testsuite/Makefile.am include/Makefile.am include/my_global.h include/my_pthread.h libmysql/CMakeLists.txt libmysql/Makefile.am libmysql/Makefile.shared libmysql_r/Makefile.am libmysqld/CMakeLists.txt libmysqld/Makefile.am libmysqld/examples/CMakeLists.txt libmysqld/examples/Makefile.am man/CMakeLists.txt man/Makefile.am mysql-test/CMakeLists.txt mysql-test/Makefile.am mysql-test/collections/default.experimental mysql-test/extra/rpl_tests/rpl_extraMaster_Col.test mysql-test/extra/rpl_tests/rpl_row_tabledefs.test mysql-test/include/ctype_numconv.inc mysql-test/include/mysqld--help.inc mysql-test/include/show_slave_status.inc mysql-test/include/show_slave_status2.inc mysql-test/include/test_fieldsize.inc mysql-test/lib/My/SafeProcess/Makefile.am mysql-test/r/ctype_binary.result mysql-test/r/ctype_cp1251.result mysql-test/r/ctype_latin1.result mysql-test/r/ctype_ucs.result mysql-test/r/information_schema.result mysql-test/r/mysql_client_test.result mysql-test/r/partition.result mysql-test/r/sp.result mysql-test/r/trigger.result mysql-test/r/variables_debug.result mysql-test/suite/funcs_1/r/innodb_storedproc_10.result mysql-test/suite/funcs_1/r/memory_storedproc_10.result mysql-test/suite/funcs_1/r/myisam_storedproc_10.result mysql-test/suite/funcs_1/r/ndb_storedproc_10.result mysql-test/suite/parts/r/rpl_partition.result mysql-test/suite/parts/t/rpl_partition.test mysql-test/suite/rpl/r/rpl_000015.result mysql-test/suite/rpl/r/rpl_bug33931.result mysql-test/suite/rpl/r/rpl_change_master.result mysql-test/suite/rpl/r/rpl_deadlock_innodb.result mysql-test/suite/rpl/r/rpl_extraColmaster_innodb.result mysql-test/suite/rpl/r/rpl_extraColmaster_myisam.result mysql-test/suite/rpl/r/rpl_flushlog_loop.result mysql-test/suite/rpl/r/rpl_grant.result mysql-test/suite/rpl/r/rpl_heartbeat.result mysql-test/suite/rpl/r/rpl_incident.result mysql-test/suite/rpl/r/rpl_known_bugs_detection.result mysql-test/suite/rpl/r/rpl_loaddata_fatal.result mysql-test/suite/rpl/r/rpl_log_pos.result mysql-test/suite/rpl/r/rpl_rbr_to_sbr.result mysql-test/suite/rpl/r/rpl_replicate_do.result mysql-test/suite/rpl/r/rpl_rotate_logs.result mysql-test/suite/rpl/r/rpl_row_colSize.result mysql-test/suite/rpl/r/rpl_row_log.result mysql-test/suite/rpl/r/rpl_row_log_innodb.result mysql-test/suite/rpl/r/rpl_row_max_relay_size.result mysql-test/suite/rpl/r/rpl_row_reset_slave.result mysql-test/suite/rpl/r/rpl_row_tabledefs_2myisam.result mysql-test/suite/rpl/r/rpl_row_tabledefs_3innodb.result mysql-test/suite/rpl/r/rpl_row_until.result mysql-test/suite/rpl/r/rpl_skip_error.result mysql-test/suite/rpl/r/rpl_slave_skip.result mysql-test/suite/rpl/r/rpl_ssl.result mysql-test/suite/rpl/r/rpl_ssl1.result mysql-test/suite/rpl/r/rpl_stm_log.result mysql-test/suite/rpl/r/rpl_stm_max_relay_size.result mysql-test/suite/rpl/r/rpl_stm_reset_slave.result mysql-test/suite/rpl/r/rpl_stm_until.result mysql-test/suite/rpl/r/rpl_temporary_errors.result mysql-test/suite/rpl/t/disabled.def mysql-test/suite/rpl/t/rpl_bug33931.test mysql-test/suite/rpl/t/rpl_flushlog_loop.test mysql-test/suite/rpl/t/rpl_incident.test mysql-test/suite/rpl/t/rpl_known_bugs_detection.test mysql-test/suite/rpl/t/rpl_rbr_to_sbr.test mysql-test/suite/rpl/t/rpl_replicate_do.test mysql-test/suite/rpl/t/rpl_row_until.test mysql-test/suite/rpl/t/rpl_slave_skip.test mysql-test/suite/rpl/t/rpl_ssl.test mysql-test/suite/rpl/t/rpl_ssl1.test mysql-test/suite/rpl_ndb/r/rpl_ndb_basic.result mysql-test/suite/rpl_ndb/r/rpl_ndb_circular.result mysql-test/suite/rpl_ndb/r/rpl_ndb_circular_simplex.result mysql-test/suite/rpl_ndb/r/rpl_ndb_idempotent.result mysql-test/suite/rpl_ndb/r/rpl_ndb_log.result mysql-test/suite/rpl_ndb/r/rpl_ndb_sync.result mysql-test/suite/rpl_ndb/t/rpl_ndb_basic.test mysql-test/suite/rpl_ndb/t/rpl_ndb_circular.test mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_simplex.test mysql-test/suite/rpl_ndb/t/rpl_ndb_idempotent.test mysql-test/suite/rpl_ndb/t/rpl_ndb_sync.test mysql-test/t/information_schema.test mysql-test/t/mysql_client_test.test mysql-test/t/parser_stack.test mysql-test/t/partition.test mysql-test/t/trigger.test mysql-test/t/variables_debug.test mysys/CMakeLists.txt mysys/Makefile.am netware/Makefile.am plugin/Makefile.am plugin/audit_null/CMakeLists.txt plugin/daemon_example/Makefile.am plugin/fulltext/CMakeLists.txt plugin/fulltext/Makefile.am pstack/Makefile.am pstack/aout/Makefile.am regex/Makefile.am scripts/CMakeLists.txt scripts/Makefile.am scripts/mysqld_safe.sh sql-bench/CMakeLists.txt sql-bench/Makefile.am sql-common/Makefile.am sql/Makefile.am sql/ha_ndbcluster_binlog.cc sql/item_func.cc sql/log_event.cc sql/protocol.cc sql/rpl_mi.cc sql/rpl_mi.h sql/share/Makefile.am sql/slave.cc sql/sql_class.cc sql/sql_class.h sql/sql_delete.cc sql/sql_insert.cc sql/sql_lex.cc sql/sql_lex.h sql/sql_parse.cc sql/sql_parse.h sql/sql_signal.cc sql/sql_update.cc storage/Makefile.am storage/archive/Makefile.am storage/blackhole/Makefile.am storage/csv/Makefile.am storage/example/Makefile.am storage/federated/Makefile.am storage/heap/Makefile.am storage/ibmdb2i/Makefile.am storage/innobase/Makefile.am storage/myisam/Makefile.am storage/myisammrg/Makefile.am storage/ndb/Makefile.am storage/ndb/docs/Makefile.am storage/ndb/include/Makefile.am storage/ndb/src/Makefile.am storage/ndb/src/common/Makefile.am storage/ndb/src/common/debugger/Makefile.am storage/ndb/src/common/debugger/signaldata/Makefile.am storage/ndb/src/common/logger/Makefile.am storage/ndb/src/common/mgmcommon/Makefile.am storage/ndb/src/common/portlib/Makefile.am storage/ndb/src/common/transporter/Makefile.am storage/ndb/src/common/util/Makefile.am storage/ndb/src/cw/Makefile.am storage/ndb/src/cw/cpcd/Makefile.am storage/ndb/src/kernel/Makefile.am storage/ndb/src/kernel/blocks/Makefile.am storage/ndb/src/kernel/blocks/backup/Makefile.am storage/ndb/src/kernel/blocks/dbdict/Makefile.am storage/ndb/src/kernel/blocks/dbdih/Makefile.am storage/ndb/src/kernel/blocks/dblqh/Makefile.am storage/ndb/src/kernel/blocks/dbtup/Makefile.am storage/ndb/src/kernel/error/Makefile.am storage/ndb/src/kernel/vm/Makefile.am storage/ndb/src/mgmapi/Makefile.am storage/ndb/src/mgmclient/Makefile.am storage/ndb/src/mgmsrv/Makefile.am storage/ndb/src/ndbapi/Makefile.am storage/ndb/test/Makefile.am storage/ndb/test/ndbapi/Makefile.am storage/ndb/test/ndbapi/bank/Makefile.am storage/ndb/test/run-test/Makefile.am storage/ndb/test/src/Makefile.am storage/ndb/test/tools/Makefile.am storage/ndb/tools/Makefile.am storage/perfschema/pfs_engine_table.cc storage/perfschema/pfs_global.cc storage/perfschema/pfs_global.h strings/Makefile.am support-files/CMakeLists.txt support-files/MacOSX/Makefile.am support-files/Makefile.am support-files/RHEL4-SElinux/Makefile.am support-files/mysql.spec.sh tests/Makefile.am unittest/Makefile.am unittest/examples/Makefile.am unittest/mysys/CMakeLists.txt unittest/mysys/Makefile.am unittest/mytap/t/Makefile.am vio/Makefile.am win/Makefile.am zlib/Makefile.am === modified file 'mysql-test/suite/perfschema/r/myisam_table_io.result' --- a/mysql-test/suite/perfschema/r/myisam_table_io.result 2010-05-07 12:14:13 +0000 +++ b/mysql-test/suite/perfschema/r/myisam_table_io.result 2010-05-25 08:19:01 +0000 @@ -60,51 +60,51 @@ event_name short_source object_type obje wait/io/table/sql/handler handler.cc: TABLE test no_index_tab insert NULL wait/io/table/sql/handler handler.cc: TABLE test no_index_tab insert NULL wait/io/table/sql/handler handler.cc: TABLE test no_index_tab insert NULL -wait/io/table/sql/handler handler.h: TABLE test no_index_tab fetch NULL -wait/io/table/sql/handler handler.h: TABLE test no_index_tab fetch NULL -wait/io/table/sql/handler handler.h: TABLE test no_index_tab fetch NULL -wait/io/table/sql/handler handler.h: TABLE test no_index_tab fetch NULL -wait/io/table/sql/handler handler.h: TABLE test no_index_tab fetch NULL +wait/io/table/sql/handler handler.cc: TABLE test no_index_tab fetch NULL +wait/io/table/sql/handler handler.cc: TABLE test no_index_tab fetch NULL +wait/io/table/sql/handler handler.cc: TABLE test no_index_tab fetch NULL +wait/io/table/sql/handler handler.cc: TABLE test no_index_tab fetch NULL +wait/io/table/sql/handler handler.cc: TABLE test no_index_tab fetch NULL wait/io/table/sql/handler handler.cc: TABLE test no_index_tab update NULL -wait/io/table/sql/handler handler.h: TABLE test no_index_tab fetch NULL +wait/io/table/sql/handler handler.cc: TABLE test no_index_tab fetch NULL wait/io/table/sql/handler handler.cc: TABLE test no_index_tab update NULL -wait/io/table/sql/handler handler.h: TABLE test no_index_tab fetch NULL +wait/io/table/sql/handler handler.cc: TABLE test no_index_tab fetch NULL wait/io/table/sql/handler handler.cc: TABLE test no_index_tab update NULL -wait/io/table/sql/handler handler.h: TABLE test no_index_tab fetch NULL -wait/io/table/sql/handler handler.h: TABLE test no_index_tab fetch NULL -wait/io/table/sql/handler handler.h: TABLE test no_index_tab fetch NULL -wait/io/table/sql/handler handler.h: TABLE test no_index_tab fetch NULL -wait/io/table/sql/handler handler.h: TABLE test no_index_tab fetch NULL -wait/io/table/sql/handler handler.h: TABLE test no_index_tab fetch NULL +wait/io/table/sql/handler handler.cc: TABLE test no_index_tab fetch NULL +wait/io/table/sql/handler handler.cc: TABLE test no_index_tab fetch NULL +wait/io/table/sql/handler handler.cc: TABLE test no_index_tab fetch NULL +wait/io/table/sql/handler handler.cc: TABLE test no_index_tab fetch NULL +wait/io/table/sql/handler handler.cc: TABLE test no_index_tab fetch NULL +wait/io/table/sql/handler handler.cc: TABLE test no_index_tab fetch NULL wait/io/table/sql/handler handler.cc: TABLE test no_index_tab delete NULL -wait/io/table/sql/handler handler.h: TABLE test no_index_tab fetch NULL -wait/io/table/sql/handler handler.h: TABLE test no_index_tab fetch NULL -wait/io/table/sql/handler handler.h: TABLE test no_index_tab fetch NULL -wait/io/table/sql/handler handler.h: TABLE test no_index_tab fetch NULL +wait/io/table/sql/handler handler.cc: TABLE test no_index_tab fetch NULL +wait/io/table/sql/handler handler.cc: TABLE test no_index_tab fetch NULL +wait/io/table/sql/handler handler.cc: TABLE test no_index_tab fetch NULL +wait/io/table/sql/handler handler.cc: TABLE test no_index_tab fetch NULL wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab insert NULL wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab insert NULL wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab insert NULL -wait/io/table/sql/handler handler.h: TEMPORARY TABLE test temp_tab fetch NULL -wait/io/table/sql/handler handler.h: TEMPORARY TABLE test temp_tab fetch NULL -wait/io/table/sql/handler handler.h: TEMPORARY TABLE test temp_tab fetch NULL -wait/io/table/sql/handler handler.h: TEMPORARY TABLE test temp_tab fetch NULL -wait/io/table/sql/handler handler.h: TEMPORARY TABLE test temp_tab fetch NULL +wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab fetch NULL +wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab fetch NULL +wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab fetch NULL +wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab fetch NULL +wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab fetch NULL wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab update NULL -wait/io/table/sql/handler handler.h: TEMPORARY TABLE test temp_tab fetch NULL +wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab fetch NULL wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab update NULL -wait/io/table/sql/handler handler.h: TEMPORARY TABLE test temp_tab fetch NULL +wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab fetch NULL wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab update NULL -wait/io/table/sql/handler handler.h: TEMPORARY TABLE test temp_tab fetch NULL -wait/io/table/sql/handler handler.h: TEMPORARY TABLE test temp_tab fetch NULL -wait/io/table/sql/handler handler.h: TEMPORARY TABLE test temp_tab fetch NULL -wait/io/table/sql/handler handler.h: TEMPORARY TABLE test temp_tab fetch NULL -wait/io/table/sql/handler handler.h: TEMPORARY TABLE test temp_tab fetch NULL -wait/io/table/sql/handler handler.h: TEMPORARY TABLE test temp_tab fetch NULL +wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab fetch NULL +wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab fetch NULL +wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab fetch NULL +wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab fetch NULL +wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab fetch NULL +wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab fetch NULL wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab delete NULL -wait/io/table/sql/handler handler.h: TEMPORARY TABLE test temp_tab fetch NULL -wait/io/table/sql/handler handler.h: TEMPORARY TABLE test temp_tab fetch NULL -wait/io/table/sql/handler handler.h: TEMPORARY TABLE test temp_tab fetch NULL -wait/io/table/sql/handler handler.h: TEMPORARY TABLE test temp_tab fetch NULL +wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab fetch NULL +wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab fetch NULL +wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab fetch NULL +wait/io/table/sql/handler handler.cc: TEMPORARY TABLE test temp_tab fetch NULL show status like 'performance_schema_%'; Variable_name Value Performance_schema_cond_classes_lost 0 === modified file 'sql/filesort.cc' --- a/sql/filesort.cc 2010-05-05 08:16:47 +0000 +++ b/sql/filesort.cc 2010-05-25 08:19:01 +0000 @@ -585,11 +585,11 @@ static ha_rows find_all_keys(SORTPARAM * error= my_errno ? my_errno : -1; /* Abort */ break; } - error=file->rnd_pos(sort_form->record[0],next_pos); + error= file->ha_rnd_pos(sort_form->record[0], next_pos); } else { - error=file->ha_rnd_next(sort_form->record[0]); + error= file->ha_rnd_next(sort_form->record[0]); if (!flag) { my_store_ptr(ref_pos,ref_length,record); // Position to row === modified file 'sql/ha_partition.cc' --- a/sql/ha_partition.cc 2010-05-05 08:16:47 +0000 +++ b/sql/ha_partition.cc 2010-05-25 08:19:01 +0000 @@ -3933,7 +3933,7 @@ int ha_partition::rnd_pos(uchar * buf, u DBUG_ASSERT(part_id < m_tot_parts); file= m_file[part_id]; m_last_part= part_id; - DBUG_RETURN(file->rnd_pos(buf, (pos + PARTITION_BYTES_IN_POS))); + DBUG_RETURN(file->ha_rnd_pos(buf, (pos + PARTITION_BYTES_IN_POS))); } === modified file 'sql/handler.cc' --- a/sql/handler.cc 2010-05-05 08:16:47 +0000 +++ b/sql/handler.cc 2010-05-25 08:19:01 +0000 @@ -2125,7 +2125,17 @@ int handler::ha_open(TABLE *table_arg, c } else { - psi_open(); + DBUG_ASSERT(m_psi == NULL); + DBUG_ASSERT(table_share != NULL); +#ifdef HAVE_PSI_INTERFACE + if (likely(PSI_server != NULL)) + { + PSI_table_share *share_psi= ha_table_share_psi(table_share); + if (likely(share_psi != NULL)) + m_psi= PSI_server->open_table(share_psi, this); + } +#endif + if (table->s->db_options_in_use & HA_OPTION_READ_ONLY_DATA) table->db_stat|=HA_READ_ONLY; (void) extra(HA_EXTRA_NO_READCHECK); // Not needed in SQL @@ -2134,8 +2144,7 @@ int handler::ha_open(TABLE *table_arg, c if (!ref && !(ref= (uchar*) alloc_root(&table->mem_root, ALIGN_SIZE(ref_length)*2))) { - psi_close(); - close(); + ha_close(); error=HA_ERR_OUT_OF_MEM; } else @@ -2145,6 +2154,133 @@ int handler::ha_open(TABLE *table_arg, c DBUG_RETURN(error); } +int handler::ha_close(void) +{ +#ifdef HAVE_PSI_INTERFACE + if (likely(PSI_server && m_psi)) + { + PSI_server->close_table(m_psi); + m_psi= NULL; /* instrumentation handle, invalid after close_table() */ + } +#endif + DBUG_ASSERT(m_psi == NULL); + return close(); +} + +int handler::ha_rnd_next(uchar *buf) +{ + int result; + struct PSI_table_locker *locker; + locker= MYSQL_START_TABLE_WAIT(m_psi, PSI_TABLE_FETCH_ROW, MAX_KEY, 0); + result= rnd_next(buf); + MYSQL_END_TABLE_WAIT(locker); + return result; +} + +int handler::ha_rnd_pos(uchar *buf, uchar *pos) +{ + int result; + struct PSI_table_locker *locker; + locker= MYSQL_START_TABLE_WAIT(m_psi, PSI_TABLE_FETCH_ROW, MAX_KEY, 0); + result= rnd_pos(buf, pos); + MYSQL_END_TABLE_WAIT(locker); + return result; +} + +int handler::ha_index_read_map(uchar *buf, const uchar *key, + key_part_map keypart_map, + enum ha_rkey_function find_flag) +{ + int result; + struct PSI_table_locker *locker; + locker= MYSQL_START_TABLE_WAIT(m_psi, PSI_TABLE_FETCH_ROW, active_index, 0); + result= index_read_map(buf, key, keypart_map, find_flag); + MYSQL_END_TABLE_WAIT(locker); + return result; +} + +int handler::ha_index_read_idx_map(uchar *buf, uint index, const uchar *key, + key_part_map keypart_map, + enum ha_rkey_function find_flag) +{ + int result; + struct PSI_table_locker *locker; + locker= MYSQL_START_TABLE_WAIT(m_psi, PSI_TABLE_FETCH_ROW, index, 0); + result= index_read_idx_map(buf, index, key, keypart_map, find_flag); + MYSQL_END_TABLE_WAIT(locker); + return result; +} + +int handler::ha_index_next(uchar * buf) +{ + int result; + struct PSI_table_locker *locker; + locker= MYSQL_START_TABLE_WAIT(m_psi, PSI_TABLE_FETCH_ROW, active_index, 0); + result= index_next(buf); + MYSQL_END_TABLE_WAIT(locker); + return result; +} + +int handler::ha_index_prev(uchar * buf) +{ + int result; + struct PSI_table_locker *locker; + locker= MYSQL_START_TABLE_WAIT(m_psi, PSI_TABLE_FETCH_ROW, active_index, 0); + result= index_prev(buf); + MYSQL_END_TABLE_WAIT(locker); + return result; +} + +int handler::ha_index_first(uchar * buf) +{ + int result; + struct PSI_table_locker *locker; + locker= MYSQL_START_TABLE_WAIT(m_psi, PSI_TABLE_FETCH_ROW, active_index, 0); + result= index_first(buf); + MYSQL_END_TABLE_WAIT(locker); + return result; +} + +int handler::ha_index_last(uchar * buf) +{ + int result; + struct PSI_table_locker *locker; + locker= MYSQL_START_TABLE_WAIT(m_psi, PSI_TABLE_FETCH_ROW, active_index, 0); + result= index_last(buf); + MYSQL_END_TABLE_WAIT(locker); + return result; +} + +int handler::ha_index_next_same(uchar *buf, const uchar *key, uint keylen) +{ + int result; + struct PSI_table_locker *locker; + locker= MYSQL_START_TABLE_WAIT(m_psi, PSI_TABLE_FETCH_ROW, active_index, 0); + result= index_next_same(buf, key, keylen); + MYSQL_END_TABLE_WAIT(locker); + return result; +} + +int handler::ha_index_read(uchar *buf, const uchar *key, uint key_len, + enum ha_rkey_function find_flag) +{ + int result; + struct PSI_table_locker *locker; + locker= MYSQL_START_TABLE_WAIT(m_psi, PSI_TABLE_FETCH_ROW, active_index, 0); + result= index_read(buf, key, key_len, find_flag); + MYSQL_END_TABLE_WAIT(locker); + return result; +} + +int handler::ha_index_read_last(uchar *buf, const uchar *key, uint key_len) +{ + int result; + struct PSI_table_locker *locker; + locker= MYSQL_START_TABLE_WAIT(m_psi, PSI_TABLE_FETCH_ROW, active_index, 0); + result= index_read_last(buf, key, key_len); + MYSQL_END_TABLE_WAIT(locker); + return result; +} /** Read first row (only) from a table. @@ -2168,14 +2304,14 @@ int handler::read_first_row(uchar * buf, !(index_flags(primary_key, 0, 0) & HA_READ_ORDER)) { (void) ha_rnd_init(1); - while ((error= rnd_next(buf)) == HA_ERR_RECORD_DELETED) ; + while ((error= ha_rnd_next(buf)) == HA_ERR_RECORD_DELETED) ; (void) ha_rnd_end(); } else { /* Find the first row through the primary key */ (void) ha_index_init(primary_key, 0); - error=index_first(buf); + error= ha_index_first(buf); (void) ha_index_end(); } DBUG_RETURN(error); @@ -2549,7 +2685,7 @@ void handler::get_auto_increment(ulonglo index_init(table->s->next_number_index, 1); if (table->s->next_number_keypart == 0) { // Autoincrement at key-start - error=index_last(table->record[1]); + error= ha_index_last(table->record[1]); /* MySQL implicitely assumes such method does locking (as MySQL decides to use nr+increment without checking again with the handler, in @@ -2563,9 +2699,9 @@ void handler::get_auto_increment(ulonglo key_copy(key, table->record[0], table->key_info + table->s->next_number_index, table->s->next_number_key_offset); - error= index_read_map(table->record[1], key, - make_prev_keypart_map(table->s->next_number_keypart), - HA_READ_PREFIX_LAST); + error= ha_index_read_map(table->record[1], key, + make_prev_keypart_map(table->s->next_number_keypart), + HA_READ_PREFIX_LAST); /* MySQL needs to call us for next row: assume we are inserting ("a",null) here, we return 3, and next this statement will want to insert @@ -4227,12 +4363,12 @@ int handler::read_range_first(const key_ range_key_part= table->key_info[active_index].key_part; if (!start_key) // Read first record - result= index_first(table->record[0]); + result= ha_index_first(table->record[0]); else - result= index_read_map(table->record[0], - start_key->key, - start_key->keypart_map, - start_key->flag); + result= ha_index_read_map(table->record[0], + start_key->key, + start_key->keypart_map, + start_key->flag); if (result) DBUG_RETURN((result == HA_ERR_KEY_NOT_FOUND) ? HA_ERR_END_OF_FILE @@ -4263,11 +4399,11 @@ int handler::read_range_next() if (eq_range) { /* We trust that index_next_same always gives a row in range */ - DBUG_RETURN(index_next_same(table->record[0], - end_range->key, - end_range->length)); + DBUG_RETURN(ha_index_next_same(table->record[0], + end_range->key, + end_range->length)); } - result= index_next(table->record[0]); + result= ha_index_next(table->record[0]); if (result) DBUG_RETURN(result); DBUG_RETURN(compare_key(end_range) <= 0 ? 0 : HA_ERR_END_OF_FILE); === modified file 'sql/handler.h' --- a/sql/handler.h 2010-05-05 08:16:47 +0000 +++ b/sql/handler.h 2010-05-25 08:19:01 +0000 @@ -32,7 +32,6 @@ #include #include #include -#include #ifndef NO_HASH #define NO_HASH /* Not yet implemented */ @@ -1266,11 +1265,7 @@ public: /* ha_ methods: public wrappers for private virtual API */ int ha_open(TABLE *table, const char *name, int mode, int test_if_locked); - int ha_close(void) - { - psi_close(); - return close(); - } + int ha_close(void); int ha_index_init(uint idx, bool sorted) { int result; @@ -1302,15 +1297,22 @@ public: inited=NONE; DBUG_RETURN(rnd_end()); } - int ha_rnd_next(uchar *buf) - { - int result; - struct PSI_table_locker *locker; - locker= MYSQL_START_TABLE_WAIT(m_psi, PSI_TABLE_FETCH_ROW, MAX_KEY, 0); - result= rnd_next(buf); - MYSQL_END_TABLE_WAIT(locker); - return result; - } + int ha_rnd_next(uchar *buf); + int ha_rnd_pos(uchar * buf, uchar *pos); + int ha_index_read_map(uchar *buf, const uchar *key, + key_part_map keypart_map, + enum ha_rkey_function find_flag); + int ha_index_read_idx_map(uchar *buf, uint index, const uchar *key, + key_part_map keypart_map, + enum ha_rkey_function find_flag); + int ha_index_next(uchar * buf); + int ha_index_prev(uchar * buf); + int ha_index_first(uchar * buf); + int ha_index_last(uchar * buf); + int ha_index_next_same(uchar *buf, const uchar *key, uint keylen); + int ha_index_read(uchar *buf, const uchar *key, uint key_len, + enum ha_rkey_function find_flag); + int ha_index_read_last(uchar *buf, const uchar *key, uint key_len); int ha_reset(); /* this is necessary in many places, e.g. in HANDLER command */ int ha_index_or_rnd_end() @@ -1492,73 +1494,6 @@ public: DBUG_ASSERT(FALSE); return HA_ERR_WRONG_COMMAND; } - int ha_index_read_map(uchar *buf, const uchar *key, - key_part_map keypart_map, - enum ha_rkey_function find_flag) - { - int result; - struct PSI_table_locker *locker; - locker= MYSQL_START_TABLE_WAIT(m_psi, PSI_TABLE_FETCH_ROW, active_index, 0); - result= index_read_map(buf, key, keypart_map, find_flag); - MYSQL_END_TABLE_WAIT(locker); - return result; - } - int ha_index_read_idx_map(uchar *buf, uint index, const uchar *key, - key_part_map keypart_map, - enum ha_rkey_function find_flag) - { - int result; - struct PSI_table_locker *locker; - locker= MYSQL_START_TABLE_WAIT(m_psi, PSI_TABLE_FETCH_ROW, index, 0); - result= index_read_idx_map(buf, index, key, keypart_map, find_flag); - MYSQL_END_TABLE_WAIT(locker); - return result; - } - int ha_index_next(uchar * buf) - { - int result; - struct PSI_table_locker *locker; - locker= MYSQL_START_TABLE_WAIT(m_psi, PSI_TABLE_FETCH_ROW, active_index, 0); - result= index_next(buf); - MYSQL_END_TABLE_WAIT(locker); - return result; - } - int ha_index_prev(uchar * buf) - { - int result; - struct PSI_table_locker *locker; - locker= MYSQL_START_TABLE_WAIT(m_psi, PSI_TABLE_FETCH_ROW, active_index, 0); - result= index_prev(buf); - MYSQL_END_TABLE_WAIT(locker); - return result; - } - int ha_index_first(uchar * buf) - { - int result; - struct PSI_table_locker *locker; - locker= MYSQL_START_TABLE_WAIT(m_psi, PSI_TABLE_FETCH_ROW, active_index, 0); - result= index_first(buf); - MYSQL_END_TABLE_WAIT(locker); - return result; - } - int ha_index_last(uchar * buf) - { - int result; - struct PSI_table_locker *locker; - locker= MYSQL_START_TABLE_WAIT(m_psi, PSI_TABLE_FETCH_ROW, active_index, 0); - result= index_last(buf); - MYSQL_END_TABLE_WAIT(locker); - return result; - } - int ha_index_next_same(uchar *buf, const uchar *key, uint keylen) - { - int result; - struct PSI_table_locker *locker; - locker= MYSQL_START_TABLE_WAIT(m_psi, PSI_TABLE_FETCH_ROW, active_index, 0); - result= index_next_same(buf, key, keylen); - MYSQL_END_TABLE_WAIT(locker); - return result; - } protected: /** @brief @@ -1619,8 +1554,8 @@ public: virtual int ft_read(uchar *buf) { return HA_ERR_WRONG_COMMAND; } protected: virtual int rnd_next(uchar *buf)=0; -public: virtual int rnd_pos(uchar * buf, uchar *pos)=0; +public: /** One has to use this method when to find random position by record as the plain @@ -1630,7 +1565,7 @@ public: virtual int rnd_pos_by_record(uchar *record) { position(record); - return rnd_pos(record, ref); + return ha_rnd_pos(record, ref); } virtual int read_first_row(uchar *buf, uint primary_key); /** @@ -1941,32 +1876,6 @@ protected: */ PSI_table_share *ha_table_share_psi(const TABLE_SHARE *share) const; - inline void psi_open() - { - DBUG_ASSERT(m_psi == NULL); - DBUG_ASSERT(table_share != NULL); -#ifdef HAVE_PSI_INTERFACE - if (likely(PSI_server != NULL)) - { - PSI_table_share *share_psi= ha_table_share_psi(table_share); - if (likely(share_psi != NULL)) - m_psi= PSI_server->open_table(share_psi, this); - } -#endif - } - - inline void psi_close() - { -#ifdef HAVE_PSI_INTERFACE - if (likely(PSI_server && m_psi)) - { - PSI_server->close_table(m_psi); - m_psi= NULL; /* instrumentation handle, invalid after close_table() */ - } -#endif - DBUG_ASSERT(m_psi == NULL); - } - /** Default rename_table() and delete_table() rename/delete files with a given name and extensions from bas_ext(). @@ -2068,25 +1977,6 @@ private: { return HA_ADMIN_NOT_IMPLEMENTED; } virtual void start_bulk_insert(ha_rows rows) {} virtual int end_bulk_insert() { return 0; } - int ha_index_read(uchar *buf, const uchar *key, uint key_len, - enum ha_rkey_function find_flag) - { - int result; - struct PSI_table_locker *locker; - locker= MYSQL_START_TABLE_WAIT(m_psi, PSI_TABLE_FETCH_ROW, active_index, 0); - result= index_read(buf, key, key_len, find_flag); - MYSQL_END_TABLE_WAIT(locker); - return result; - } - int ha_index_read_last(uchar *buf, const uchar *key, uint key_len) - { - int result; - struct PSI_table_locker *locker; - locker= MYSQL_START_TABLE_WAIT(m_psi, PSI_TABLE_FETCH_ROW, active_index, 0); - result= index_read_last(buf, key, key_len); - MYSQL_END_TABLE_WAIT(locker); - return result; - } protected: virtual int index_read(uchar * buf, const uchar * key, uint key_len, enum ha_rkey_function find_flag) === modified file 'sql/log_event.cc' --- a/sql/log_event.cc 2010-05-20 14:42:09 +0000 +++ b/sql/log_event.cc 2010-05-25 08:19:01 +0000 @@ -8739,19 +8739,19 @@ Rows_log_event::write_row(const Relay_lo We need to retrieve the old row into record[1] to be able to either update or delete the offending record. We either: - - use rnd_pos() with a row-id (available as dupp_row) to the + - use ha_rnd_pos() with a row-id (available as dupp_row) to the offending row, if that is possible (MyISAM and Blackhole), or else - - use index_read_idx() with the key that is duplicated, to + - use ha_index_read_idx_map() with the key that is duplicated, to retrieve the offending row. */ if (table->file->ha_table_flags() & HA_DUPLICATE_POS) { - DBUG_PRINT("info",("Locating offending record using rnd_pos()")); - error= table->file->rnd_pos(table->record[1], table->file->dup_ref); + DBUG_PRINT("info",("Locating offending record using ha_rnd_pos()")); + error= table->file->ha_rnd_pos(table->record[1], table->file->dup_ref); if (error) { - DBUG_PRINT("info",("rnd_pos() returns error %d",error)); + DBUG_PRINT("info",("ha_rnd_pos() returns error %d",error)); if (error == HA_ERR_RECORD_DELETED) error= HA_ERR_KEY_NOT_FOUND; table->file->print_error(error, MYF(0)); @@ -8786,7 +8786,7 @@ Rows_log_event::write_row(const Relay_lo HA_READ_KEY_EXACT); if (error) { - DBUG_PRINT("info",("index_read_idx() returns %s", HA_ERR(error))); + DBUG_PRINT("info",("ha_index_read_idx_map() returns %s", HA_ERR(error))); if (error == HA_ERR_RECORD_DELETED) error= HA_ERR_KEY_NOT_FOUND; table->file->print_error(error, MYF(0)); === modified file 'sql/log_event_old.cc' --- a/sql/log_event_old.cc 2010-05-05 08:16:47 +0000 +++ b/sql/log_event_old.cc 2010-05-25 08:19:01 +0000 @@ -517,18 +517,18 @@ replace_record(THD *thd, TABLE *table, We need to retrieve the old row into record[1] to be able to either update or delete the offending record. We either: - - use rnd_pos() with a row-id (available as dupp_row) to the + - use ha_rnd_pos() with a row-id (available as dupp_row) to the offending row, if that is possible (MyISAM and Blackhole), or else - - use index_read_idx() with the key that is duplicated, to + - use ha_index_read_idx_map() with the key that is duplicated, to retrieve the offending row. */ if (table->file->ha_table_flags() & HA_DUPLICATE_POS) { - error= table->file->rnd_pos(table->record[1], table->file->dup_ref); + error= table->file->ha_rnd_pos(table->record[1], table->file->dup_ref); if (error) { - DBUG_PRINT("info",("rnd_pos() returns error %d",error)); + DBUG_PRINT("info",("ha_rnd_pos() returns error %d",error)); if (error == HA_ERR_RECORD_DELETED) error= HA_ERR_KEY_NOT_FOUND; table->file->print_error(error, MYF(0)); @@ -557,7 +557,7 @@ replace_record(THD *thd, TABLE *table, HA_READ_KEY_EXACT); if (error) { - DBUG_PRINT("info", ("index_read_idx() returns error %d", error)); + DBUG_PRINT("info", ("ha_index_read_idx_map() returns error %d", error)); if (error == HA_ERR_RECORD_DELETED) error= HA_ERR_KEY_NOT_FOUND; table->file->print_error(error, MYF(0)); @@ -672,9 +672,9 @@ static int find_and_fetch_row(TABLE *tab */ table->file->position(table->record[0]); - int error= table->file->rnd_pos(table->record[0], table->file->ref); + int error= table->file->ha_rnd_pos(table->record[0], table->file->ref); /* - rnd_pos() returns the record in table->record[0], so we have to + ha_rnd_pos() returns the record in table->record[0], so we have to move it to table->record[1]. */ bmove_align(table->record[1], table->record[0], table->s->reclength); @@ -2022,19 +2022,19 @@ Old_rows_log_event::write_row(const Rela We need to retrieve the old row into record[1] to be able to either update or delete the offending record. We either: - - use rnd_pos() with a row-id (available as dupp_row) to the + - use ha_rnd_pos() with a row-id (available as dupp_row) to the offending row, if that is possible (MyISAM and Blackhole), or else - - use index_read_idx() with the key that is duplicated, to + - use ha_index_read_idx_map() with the key that is duplicated, to retrieve the offending row. */ if (table->file->ha_table_flags() & HA_DUPLICATE_POS) { - DBUG_PRINT("info",("Locating offending record using rnd_pos()")); - error= table->file->rnd_pos(table->record[1], table->file->dup_ref); + DBUG_PRINT("info",("Locating offending record using ha_rnd_pos()")); + error= table->file->ha_rnd_pos(table->record[1], table->file->dup_ref); if (error) { - DBUG_PRINT("info",("rnd_pos() returns error %d",error)); + DBUG_PRINT("info",("ha_rnd_pos() returns error %d",error)); if (error == HA_ERR_RECORD_DELETED) error= HA_ERR_KEY_NOT_FOUND; table->file->print_error(error, MYF(0)); @@ -2069,7 +2069,7 @@ Old_rows_log_event::write_row(const Rela HA_READ_KEY_EXACT); if (error) { - DBUG_PRINT("info",("index_read_idx() returns error %d", error)); + DBUG_PRINT("info",("ha_index_read_idx_map() returns error %d", error)); if (error == HA_ERR_RECORD_DELETED) error= HA_ERR_KEY_NOT_FOUND; table->file->print_error(error, MYF(0)); === modified file 'sql/opt_range.cc' --- a/sql/opt_range.cc 2010-05-05 08:16:47 +0000 +++ b/sql/opt_range.cc 2010-05-25 08:19:01 +0000 @@ -8547,7 +8547,7 @@ int QUICK_ROR_INTERSECT_SELECT::get_next /* We get here if we got the same row ref in all scans. */ if (need_to_fetch_row) - error= head->file->rnd_pos(head->record[0], last_rowid); + error= head->file->ha_rnd_pos(head->record[0], last_rowid); } while (error == HA_ERR_RECORD_DELETED); DBUG_RETURN(error); } @@ -8613,7 +8613,7 @@ int QUICK_ROR_UNION_SELECT::get_next() cur_rowid= prev_rowid; prev_rowid= tmp; - error= head->file->rnd_pos(quick->record, prev_rowid); + error= head->file->ha_rnd_pos(quick->record, prev_rowid); } while (error == HA_ERR_RECORD_DELETED); DBUG_RETURN(error); } === modified file 'sql/records.cc' --- a/sql/records.cc 2010-05-05 08:16:47 +0000 +++ b/sql/records.cc 2010-05-25 08:19:01 +0000 @@ -415,7 +415,7 @@ static int rr_from_tempfile(READ_RECORD { if (my_b_read(info->io_cache,info->ref_pos,info->ref_length)) return -1; /* End of file */ - if (!(tmp=info->file->rnd_pos(info->record,info->ref_pos))) + if (!(tmp=info->file->ha_rnd_pos(info->record,info->ref_pos))) break; /* The following is extremely unlikely to happen */ if (tmp == HA_ERR_RECORD_DELETED || @@ -466,7 +466,7 @@ static int rr_from_pointers(READ_RECORD cache_pos= info->cache_pos; info->cache_pos+= info->ref_length; - if (!(tmp=info->file->rnd_pos(info->record,cache_pos))) + if (!(tmp=info->file->ha_rnd_pos(info->record,cache_pos))) break; /* The following is extremely unlikely to happen */ @@ -599,7 +599,7 @@ static int rr_from_cache(READ_RECORD *in record=uint3korr(position); position+=3; record_pos=info->cache+record*info->reclength; - if ((error=(int16) info->file->rnd_pos(record_pos,info->ref_pos))) + if ((error=(int16) info->file->ha_rnd_pos(record_pos,info->ref_pos))) { record_pos[info->error_offset]=1; shortstore(record_pos,error); === modified file 'sql/sql_insert.cc' --- a/sql/sql_insert.cc 2010-05-20 14:42:09 +0000 +++ b/sql/sql_insert.cc 2010-05-25 08:19:01 +0000 @@ -1487,7 +1487,7 @@ int write_record(THD *thd, TABLE *table, goto err; if (table->file->ha_table_flags() & HA_DUPLICATE_POS) { - if (table->file->rnd_pos(table->record[1],table->file->dup_ref)) + if (table->file->ha_rnd_pos(table->record[1],table->file->dup_ref)) goto err; } else === modified file 'sql/sql_select.cc' --- a/sql/sql_select.cc 2010-05-05 08:16:47 +0000 +++ b/sql/sql_select.cc 2010-05-25 08:19:01 +0000 @@ -12775,7 +12775,7 @@ end_unique_update(JOIN *join, JOIN_TAB * table->file->print_error(error,MYF(0)); /* purecov: inspected */ DBUG_RETURN(NESTED_LOOP_ERROR); /* purecov: inspected */ } - if (table->file->rnd_pos(table->record[1],table->file->dup_ref)) + if (table->file->ha_rnd_pos(table->record[1], table->file->dup_ref)) { table->file->print_error(error,MYF(0)); /* purecov: inspected */ DBUG_RETURN(NESTED_LOOP_ERROR); /* purecov: inspected */ === modified file 'sql/sql_update.cc' --- a/sql/sql_update.cc 2010-05-20 14:42:09 +0000 +++ b/sql/sql_update.cc 2010-05-25 08:19:01 +0000 @@ -160,7 +160,7 @@ static void prepare_record_for_error_mes /* Tell the engine about the new set. */ table->file->column_bitmaps_signal(); /* Read record that is identified by table->file->ref. */ - (void) table->file->rnd_pos(table->record[1], table->file->ref); + (void) table->file->ha_rnd_pos(table->record[1], table->file->ref); /* Copy the newly read columns into the new record. */ for (field_p= table->field; (field= *field_p); field_p++) if (bitmap_is_set(&unique_map, field->field_index)) @@ -1969,15 +1969,15 @@ int multi_update::do_updates() goto err; } - /* call rnd_pos() using rowids from temporary table */ + /* call ha_rnd_pos() using rowids from temporary table */ check_opt_it.rewind(); TABLE *tbl= table; uint field_num= 0; do { if((local_error= - tbl->file->rnd_pos(tbl->record[0], - (uchar *) tmp_table->field[field_num]->ptr))) + tbl->file->ha_rnd_pos(tbl->record[0], + (uchar *) tmp_table->field[field_num]->ptr))) goto err; field_num++; } while((tbl= check_opt_it++)); --===============4488897287976283659== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/marc.alff@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: marc.alff@stripped # target_branch: file:///Users/malff/BZR_TREE/mysql-next-mr-wl4895/ # testament_sha1: cdcfc96e84f542bfb9e44fb4401fbdf220a9eb8e # timestamp: 2010-05-25 02:20:27 -0600 # base_revision_id: marc.alff@stripped\ # 8si1bz6hbrkf3dgs # # Begin bundle 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 ZmOk4DRrB1wDKX9i7kinChIDJtu2AA== --===============4488897287976283659==--