summaryrefslogtreecommitdiff
path: root/sql/sql_class.h
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sql_class.h')
-rw-r--r--sql/sql_class.h427
1 files changed, 244 insertions, 183 deletions
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 7f941220140..8df3a2eee36 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -13,18 +13,13 @@
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
#ifndef SQL_CLASS_INCLUDED
#define SQL_CLASS_INCLUDED
/* Classes in mysql */
-#ifdef USE_PRAGMA_INTERFACE
-#pragma interface /* gcc class implementation */
-#endif
-
#include "my_global.h" /* NO_EMBEDDED_ACCESS_CHECKS */
#ifdef MYSQL_SERVER
#include "unireg.h" // REQUIRED: for other includes
@@ -43,6 +38,23 @@
#include "violite.h" /* vio_is_connected */
#include "thr_lock.h" /* thr_lock_type, THR_LOCK_DATA,
THR_LOCK_INFO */
+#include <mysql/psi/mysql_stage.h>
+#include <mysql/psi/mysql_statement.h>
+#include <mysql/psi/mysql_idle.h>
+#include <mysql/psi/mysql_table.h>
+#include <mysql_com_server.h>
+
+extern "C"
+void set_thd_stage_info(void *thd,
+ const PSI_stage_info *new_stage,
+ PSI_stage_info *old_stage,
+ const char *calling_func,
+ const char *calling_file,
+ const unsigned int calling_line);
+
+#define THD_STAGE_INFO(thd, stage) \
+ (thd)->enter_stage(& stage, NULL, __func__, __FILE__, __LINE__)
+
#include "my_apc.h"
class Reprepare_observer;
@@ -67,7 +79,7 @@ enum enum_delay_key_write { DELAY_KEY_WRITE_NONE, DELAY_KEY_WRITE_ON,
DELAY_KEY_WRITE_ALL };
enum enum_slave_exec_mode { SLAVE_EXEC_MODE_STRICT,
SLAVE_EXEC_MODE_IDEMPOTENT,
- SLAVE_EXEC_MODE_LAST_BIT};
+ SLAVE_EXEC_MODE_LAST_BIT };
enum enum_slave_type_conversions { SLAVE_TYPE_CONVERSIONS_ALL_LOSSY,
SLAVE_TYPE_CONVERSIONS_ALL_NON_LOSSY};
enum enum_mark_columns
@@ -540,6 +552,10 @@ typedef struct system_variables
ulong slave_skip_counter;
ulong max_relay_log_size;
+ /**
+ Default transaction access mode. READ ONLY (true) or READ WRITE (false).
+ */
+ my_bool tx_read_only;
my_bool low_priority_updates;
my_bool query_cache_wlock_invalidate;
my_bool engine_condition_pushdown;
@@ -592,8 +608,8 @@ typedef struct system_status_var
{
ulong com_other;
ulong com_stat[(uint) SQLCOM_END];
- ulong created_tmp_disk_tables;
- ulong created_tmp_tables;
+ ulong created_tmp_disk_tables_;
+ ulong created_tmp_tables_;
ulong ha_commit_count;
ulong ha_delete_count;
ulong ha_read_first_count;
@@ -625,23 +641,24 @@ typedef struct system_status_var
ulong ha_discover_count;
ulong ha_savepoint_count;
ulong ha_savepoint_rollback_count;
+ ulong ha_external_lock_count;
ulong net_big_packet_count;
ulong opened_tables;
ulong opened_shares;
ulong opened_views; /* +1 opening a view */
- ulong select_full_join_count;
- ulong select_full_range_join_count;
- ulong select_range_count;
- ulong select_range_check_count;
- ulong select_scan_count;
+ ulong select_full_join_count_;
+ ulong select_full_range_join_count_;
+ ulong select_range_count_;
+ ulong select_range_check_count_;
+ ulong select_scan_count_;
ulong executed_triggers;
ulong long_query_count;
- ulong filesort_merge_passes;
- ulong filesort_range_count;
- ulong filesort_rows;
- ulong filesort_scan_count;
+ ulong filesort_merge_passes_;
+ ulong filesort_range_count_;
+ ulong filesort_rows_;
+ ulong filesort_scan_count_;
/* Prepared statements and binary protocol */
ulong com_stmt_prepare;
ulong com_stmt_reprepare;
@@ -1597,6 +1614,8 @@ public:
Query_cache_tls query_cache_tls;
#endif
NET net; // client connection descriptor
+ /** Aditional network instrumentation for the server only. */
+ NET_SERVER m_net_server_extension;
scheduler_functions *scheduler; // Scheduler for this connection
Protocol *protocol; // Current protocol
Protocol_text protocol_text; // Normal protocol
@@ -1662,6 +1681,19 @@ public:
*/
const char *proc_info;
+private:
+ unsigned int m_current_stage_key;
+
+public:
+ void enter_stage(const PSI_stage_info *stage,
+ PSI_stage_info *old_stage,
+ const char *calling_func,
+ const char *calling_file,
+ const unsigned int calling_line);
+
+ const char *get_proc_info() const
+ { return proc_info; }
+
/*
Used in error messages to tell user in what part of MySQL we found an
error. E. g. when where= "having clause", if fix_fields() fails, user
@@ -1683,11 +1715,14 @@ public:
uint dbug_sentry; // watch out for memory corruption
#endif
struct st_my_thread_var *mysys_var;
+private:
/*
Type of current query: COM_STMT_PREPARE, COM_QUERY, etc. Set from
first byte of the packet in do_command()
*/
- enum enum_server_command command;
+ enum enum_server_command m_command;
+
+public:
uint32 server_id;
uint32 file_id; // for LOAD DATA INFILE
/* remote (peer) port */
@@ -2104,11 +2139,12 @@ public:
ha_rows cuted_fields;
+private:
/*
number of rows we actually sent to the client, including "synthetic"
rows in ROLLUP etc.
*/
- ha_rows sent_row_count;
+ ha_rows m_sent_row_count;
/**
Number of rows read and/or evaluated for a statement. Used for
@@ -2120,12 +2156,42 @@ public:
statement including ORDER BY could possibly evaluate the row in
filesort() before reading it for e.g. update.
*/
- ha_rows examined_row_count;
+ ha_rows m_examined_row_count;
+
+public:
+ ha_rows get_sent_row_count() const
+ { return m_sent_row_count; }
+
+ ha_rows get_examined_row_count() const
+ { return m_examined_row_count; }
+
+ void set_sent_row_count(ha_rows count);
+ void set_examined_row_count(ha_rows count);
+
+ void inc_sent_row_count(ha_rows count);
+ void inc_examined_row_count(ha_rows count);
+
+ void inc_status_created_tmp_disk_tables();
+ void inc_status_created_tmp_files();
+ void inc_status_created_tmp_tables();
+ void inc_status_select_full_join();
+ void inc_status_select_full_range_join();
+ void inc_status_select_range();
+ void inc_status_select_range_check();
+ void inc_status_select_scan();
+ void inc_status_sort_merge_passes();
+ void inc_status_sort_range();
+ void inc_status_sort_rows(ha_rows count);
+ void inc_status_sort_scan();
+ void set_status_no_index_used();
+ void set_status_no_good_index_used();
+
/**
The number of rows and/or keys examined by the query, both read,
changed or written.
*/
ulonglong accessed_rows_and_keys;
+
/**
Check if the number of rows accessed by a statement exceeded
LIMIT ROWS EXAMINED. If so, signal the query engine to stop execution.
@@ -2144,6 +2210,21 @@ public:
PROFILING profiling;
#endif
+ /** Current statement instrumentation. */
+ PSI_statement_locker *m_statement_psi;
+#ifdef HAVE_PSI_STATEMENT_INTERFACE
+ /** Current statement instrumentation state. */
+ PSI_statement_locker_state m_statement_state;
+#endif /* HAVE_PSI_STATEMENT_INTERFACE */
+ /** Idle instrumentation. */
+ PSI_idle_locker *m_idle_psi;
+#ifdef HAVE_PSI_IDLE_INTERFACE
+ /** Idle instrumentation state. */
+ PSI_idle_locker_state m_idle_state;
+#endif /* HAVE_PSI_IDLE_INTERFACE */
+ /** True if the server code is IDLE for this connection. */
+ bool m_server_idle;
+
/*
Id of current query. Statement can be reused to execute several queries
query_id is global in context of the whole MySQL server.
@@ -2191,6 +2272,11 @@ public:
above.
*/
enum_tx_isolation tx_isolation;
+ /*
+ Current or next transaction access mode.
+ See comment above regarding tx_isolation.
+ */
+ bool tx_read_only;
enum_check_fields count_cuted_fields;
DYNAMIC_ARRAY user_var_events; /* For user variables replication */
@@ -2450,22 +2536,20 @@ public:
int errcode);
#endif
- /*
- For enter_cond() / exit_cond() to work the mutex must be got before
- enter_cond(); this mutex is then released by exit_cond().
- Usage must be: lock mutex; enter_cond(); your code; exit_cond().
- */
- inline const char* enter_cond(mysql_cond_t *cond, mysql_mutex_t* mutex,
- const char* msg)
+ inline void
+ enter_cond(mysql_cond_t *cond, mysql_mutex_t* mutex,
+ const PSI_stage_info *stage, PSI_stage_info *old_stage,
+ const char *src_function, const char *src_file,
+ int src_line)
{
- const char* old_msg = proc_info;
mysql_mutex_assert_owner(mutex);
mysys_var->current_mutex = mutex;
mysys_var->current_cond = cond;
- proc_info = msg;
- return old_msg;
+ enter_stage(stage, old_stage, src_function, src_file, src_line);
}
- inline void exit_cond(const char* old_msg)
+ inline void exit_cond(const PSI_stage_info *stage,
+ const char *src_function, const char *src_file,
+ int src_line)
{
/*
Putting the mutex unlock in thd->exit_cond() ensures that
@@ -2477,10 +2561,15 @@ public:
mysql_mutex_lock(&mysys_var->mutex);
mysys_var->current_mutex = 0;
mysys_var->current_cond = 0;
- proc_info = old_msg;
+ enter_stage(stage, NULL, src_function, src_file, src_line);
mysql_mutex_unlock(&mysys_var->mutex);
return;
}
+ inline bool is_strict_mode() const
+ {
+ return variables.sql_mode & (MODE_STRICT_TRANS_TABLES |
+ MODE_STRICT_ALL_TABLES);
+ }
inline my_time_t query_start() { query_start_used=1; return start_time; }
inline ulong query_start_sec_part()
{ query_start_sec_part_used=1; return start_time_sec_part; }
@@ -2489,6 +2578,9 @@ public:
my_hrtime_t hrtime= my_hrtime();
start_time= hrtime_to_my_time(hrtime);
start_time_sec_part= hrtime_sec_part(hrtime);
+#ifdef HAVE_PSI_THREAD_INTERFACE
+ PSI_CALL(set_thread_start_time)(start_time);
+#endif
}
inline void set_start_time()
{
@@ -2496,6 +2588,9 @@ public:
{
start_time= hrtime_to_my_time(user_time);
start_time_sec_part= hrtime_sec_part(user_time);
+#ifdef HAVE_PSI_THREAD_INTERFACE
+ PSI_CALL(set_thread_start_time)(start_time);
+#endif
}
else
set_current_time();
@@ -2515,7 +2610,12 @@ public:
my_hrtime_t hrtime= { hrtime_from_time(t) + sec_part };
set_time(hrtime);
}
- void set_time_after_lock() { utime_after_lock= microsecond_interval_timer(); }
+ void set_time_after_lock()
+ {
+ utime_after_lock= microsecond_interval_timer();
+ MYSQL_SET_STATEMENT_LOCK_TIME(m_statement_psi,
+ (utime_after_lock - start_utime));
+ }
ulonglong current_utime() { return microsecond_interval_timer(); }
/**
@@ -2683,6 +2783,11 @@ public:
To raise this flag, use my_error().
*/
inline bool is_error() const { return stmt_da->is_error(); }
+
+ /// Returns Diagnostics-area for the current statement.
+ Diagnostics_area *get_stmt_da()
+ { return stmt_da; }
+
inline CHARSET_INFO *charset() { return variables.character_set_client; }
void update_charset();
@@ -2891,6 +2996,7 @@ public:
*/
bool set_db(const char *new_db, size_t new_db_len)
{
+ bool result;
/* Do not reallocate memory if current chunk is big enough. */
if (db && new_db && db_length >= new_db_len)
memcpy(db, new_db, new_db_len+1);
@@ -2903,7 +3009,12 @@ public:
db= NULL;
}
db_length= db ? new_db_len : 0;
- return new_db && !db;
+ result= new_db && !db;
+#ifdef HAVE_PSI_THREAD_INTERFACE
+ if (result)
+ PSI_CALL(set_thread_db)(new_db, new_db_len);
+#endif
+ return result;
}
/**
@@ -2921,6 +3032,9 @@ public:
{
db= new_db;
db_length= new_db_len;
+#ifdef HAVE_PSI_THREAD_INTERFACE
+ PSI_CALL(set_thread_db)(new_db, new_db_len);
+#endif
}
/*
Copy the current database to the argument. Use the current arena to
@@ -3037,6 +3151,9 @@ private:
public:
/** Overloaded to guard query/query_length fields */
virtual void set_statement(Statement *stmt);
+ void set_command(enum enum_server_command command);
+ inline enum enum_server_command get_command() const
+ { return m_command; }
/**
Assign a new value to thd->query and thd->query_id and mysys_var.
@@ -3226,7 +3343,7 @@ my_eof(THD *thd)
const my_bool strict_date_checking= 0;
-inline ulong sql_mode_for_dates(THD *thd)
+inline ulonglong sql_mode_for_dates(THD *thd)
{
if (strict_date_checking)
return (thd->variables.sql_mode &
@@ -3235,7 +3352,7 @@ inline ulong sql_mode_for_dates(THD *thd)
return (thd->variables.sql_mode & MODE_INVALID_DATES);
}
-inline ulong sql_mode_for_dates()
+inline ulonglong sql_mode_for_dates()
{
return sql_mode_for_dates(current_thd);
}
@@ -3546,12 +3663,18 @@ public:
#ifdef WITH_ARIA_STORAGE_ENGINE
#include <maria.h>
+#else
+#undef USE_ARIA_FOR_TMP_TABLES
#endif
#ifdef USE_ARIA_FOR_TMP_TABLES
-#define ENGINE_COLUMNDEF MARIA_COLUMNDEF
+#define TMP_ENGINE_COLUMNDEF MARIA_COLUMNDEF
+#define TMP_ENGINE_HTON maria_hton
+#define TMP_ENGINE_NAME "Aria"
#else
-#define ENGINE_COLUMNDEF MI_COLUMNDEF
+#define TMP_ENGINE_COLUMNDEF MI_COLUMNDEF
+#define TMP_ENGINE_HTON myisam_hton
+#define TMP_ENGINE_NAME "MyISAM"
#endif
/*
@@ -3574,7 +3697,7 @@ public:
Copy_field *save_copy_field, *save_copy_field_end;
uchar *group_buff;
Item **items_to_copy; /* Fields in tmp table */
- ENGINE_COLUMNDEF *recinfo, *start_recinfo;
+ TMP_ENGINE_COLUMNDEF *recinfo, *start_recinfo;
KEY *keyinfo;
ha_rows end_write_records;
/**
@@ -3822,13 +3945,13 @@ public:
/*
Cost to materialize - execute the sub-join and write rows into temp.table
*/
- COST_VECT materialization_cost;
+ Cost_estimate materialization_cost;
/* Cost to make one lookup in the temptable */
- COST_VECT lookup_cost;
+ Cost_estimate lookup_cost;
/* Cost of scanning the materialized table */
- COST_VECT scan_cost;
+ Cost_estimate scan_cost;
/* --- Execution structures ---------- */
@@ -4213,9 +4336,35 @@ public:
#define CF_CAN_GENERATE_ROW_EVENTS (1U << 9)
/**
+ Identifies statements which may deal with temporary tables and for which
+ temporary tables should be pre-opened to simplify privilege checks.
+*/
+#define CF_PREOPEN_TMP_TABLES (1U << 10)
+
+/**
+ Identifies statements for which open handlers should be closed in the
+ beginning of the statement.
+*/
+#define CF_HA_CLOSE (1U << 11)
+
+/**
+ Identifies statements that can be explained with EXPLAIN.
+*/
+#define CF_CAN_BE_EXPLAINED (1U << 12)
+
+/** Identifies statements which may generate an optimizer trace */
+#define CF_OPTIMIZER_TRACE (1U << 14)
+
+/**
+ Identifies statements that should always be disallowed in
+ read only transactions.
+*/
+#define CF_DISALLOW_IN_RO_TRANS (1U << 15)
+
+/**
Statement that need the binlog format to be unchanged.
*/
-#define CF_FORCE_ORIGINAL_BINLOG_FORMAT (1U << 10)
+#define CF_FORCE_ORIGINAL_BINLOG_FORMAT (1U << 16)
/**
Statement that inserts new rows (INSERT, REPLACE, LOAD, ALTER TABLE)
@@ -4284,112 +4433,6 @@ inline void handler::decrement_statistics(ulong SSV::*offset) const
status_var_decrement(table->in_use->status_var.*offset);
}
-inline int handler::ha_index_read_map(uchar * buf, const uchar * key,
- key_part_map keypart_map,
- enum ha_rkey_function find_flag)
-{
- DBUG_ASSERT(inited==INDEX);
- MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
- increment_statistics(&SSV::ha_read_key_count);
- int error= index_read_map(buf, key, keypart_map, find_flag);
- if (!error)
- update_index_statistics();
- table->status=error ? STATUS_NOT_FOUND: 0;
- MYSQL_INDEX_READ_ROW_DONE(error);
- return error;
-}
-
-
-/*
- @note: Other index lookup/navigation functions require prior
- handler->index_init() call. This function is different, it requires
- that the scan is not initialized, and accepts "uint index" as an argument.
-*/
-
-inline 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)
-{
- DBUG_ASSERT(inited==NONE);
- MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
- increment_statistics(&SSV::ha_read_key_count);
- int error= index_read_idx_map(buf, index, key, keypart_map, find_flag);
- if (!error)
- {
- update_rows_read();
- index_rows_read[index]++;
- }
- table->status=error ? STATUS_NOT_FOUND: 0;
- MYSQL_INDEX_READ_ROW_DONE(error);
- return error;
-}
-
-inline int handler::ha_index_next(uchar * buf)
-{
- DBUG_ASSERT(inited==INDEX);
- MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
- increment_statistics(&SSV::ha_read_next_count);
- int error= index_next(buf);
- if (!error)
- update_index_statistics();
- table->status=error ? STATUS_NOT_FOUND: 0;
- MYSQL_INDEX_READ_ROW_DONE(error);
- return error;
-}
-
-inline int handler::ha_index_prev(uchar * buf)
-{
- DBUG_ASSERT(inited==INDEX);
- MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
- increment_statistics(&SSV::ha_read_prev_count);
- int error= index_prev(buf);
- if (!error)
- update_index_statistics();
- table->status=error ? STATUS_NOT_FOUND: 0;
- MYSQL_INDEX_READ_ROW_DONE(error);
- return error;
-}
-
-inline int handler::ha_index_first(uchar * buf)
-{
- DBUG_ASSERT(inited==INDEX);
- MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
- increment_statistics(&SSV::ha_read_first_count);
- int error= index_first(buf);
- if (!error)
- update_index_statistics();
- table->status=error ? STATUS_NOT_FOUND: 0;
- MYSQL_INDEX_READ_ROW_DONE(error);
- return error;
-}
-
-inline int handler::ha_index_last(uchar * buf)
-{
- DBUG_ASSERT(inited==INDEX);
- MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
- increment_statistics(&SSV::ha_read_last_count);
- int error= index_last(buf);
- if (!error)
- update_index_statistics();
- table->status=error ? STATUS_NOT_FOUND: 0;
- MYSQL_INDEX_READ_ROW_DONE(error);
- return error;
-}
-
-inline int handler::ha_index_next_same(uchar *buf, const uchar *key,
- uint keylen)
-{
- DBUG_ASSERT(inited==INDEX);
- MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str);
- increment_statistics(&SSV::ha_read_next_count);
- int error= index_next_same(buf, key, keylen);
- if (!error)
- update_index_statistics();
- table->status=error ? STATUS_NOT_FOUND: 0;
- MYSQL_INDEX_READ_ROW_DONE(error);
- return error;
-}
inline int handler::ha_ft_read(uchar *buf)
{
@@ -4401,37 +4444,6 @@ inline int handler::ha_ft_read(uchar *buf)
return error;
}
-inline int handler::ha_rnd_next(uchar *buf)
-{
- MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str, TRUE);
- int error= rnd_next(buf);
- if (!error)
- {
- update_rows_read();
- increment_statistics(&SSV::ha_read_rnd_next_count);
- }
- else if (error == HA_ERR_RECORD_DELETED)
- increment_statistics(&SSV::ha_read_rnd_deleted_count);
- else
- increment_statistics(&SSV::ha_read_rnd_next_count);
-
- table->status=error ? STATUS_NOT_FOUND: 0;
- MYSQL_READ_ROW_DONE(error);
- return error;
-}
-
-inline int handler::ha_rnd_pos(uchar *buf, uchar *pos)
-{
- MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str, FALSE);
- increment_statistics(&SSV::ha_read_rnd_count);
- int error= rnd_pos(buf, pos);
- if (!error)
- update_rows_read();
- table->status=error ? STATUS_NOT_FOUND: 0;
- MYSQL_READ_ROW_DONE(error);
- return error;
-}
-
inline int handler::ha_rnd_pos_by_record(uchar *buf)
{
int error= rnd_pos_by_record(buf);
@@ -4452,24 +4464,73 @@ inline int handler::ha_read_first_row(uchar *buf, uint primary_key)
inline int handler::ha_write_tmp_row(uchar *buf)
{
+ int error;
MYSQL_INSERT_ROW_START(table_share->db.str, table_share->table_name.str);
increment_statistics(&SSV::ha_tmp_write_count);
- int error= write_row(buf);
+ MYSQL_TABLE_IO_WAIT(m_psi, PSI_TABLE_WRITE_ROW, MAX_KEY, 0,
+ { error= write_row(buf); })
MYSQL_INSERT_ROW_DONE(error);
return error;
}
inline int handler::ha_update_tmp_row(const uchar *old_data, uchar *new_data)
{
+ int error;
MYSQL_UPDATE_ROW_START(table_share->db.str, table_share->table_name.str);
increment_statistics(&SSV::ha_tmp_update_count);
- int error= update_row(old_data, new_data);
+ MYSQL_TABLE_IO_WAIT(m_psi, PSI_TABLE_UPDATE_ROW, active_index, 0,
+ { error= update_row(old_data, new_data);})
MYSQL_UPDATE_ROW_DONE(error);
return error;
}
extern pthread_attr_t *get_connection_attrib(void);
+/**
+ Set thread entering a condition
+
+ This function should be called before putting a thread to wait for
+ a condition. @a mutex should be held before calling this
+ function. After being waken up, @f thd_exit_cond should be called.
+
+ @param thd The thread entering the condition, NULL means current thread
+ @param cond The condition the thread is going to wait for
+ @param mutex The mutex associated with the condition, this must be
+ held before call this function
+ @param stage The new process message for the thread
+ @param old_stage The old process message for the thread
+ @param src_function The caller source function name
+ @param src_file The caller source file name
+ @param src_line The caller source line number
+*/
+void thd_enter_cond(MYSQL_THD thd, mysql_cond_t *cond, mysql_mutex_t *mutex,
+ const PSI_stage_info *stage, PSI_stage_info *old_stage,
+ const char *src_function, const char *src_file,
+ int src_line);
+
+#define THD_ENTER_COND(P1, P2, P3, P4, P5) \
+ thd_enter_cond(P1, P2, P3, P4, P5, __func__, __FILE__, __LINE__)
+
+/**
+ Set thread leaving a condition
+
+ This function should be called after a thread being waken up for a
+ condition.
+
+ @param thd The thread entering the condition, NULL means current thread
+ @param stage The process message, ususally this should be the old process
+ message before calling @f thd_enter_cond
+ @param src_function The caller source function name
+ @param src_file The caller source file name
+ @param src_line The caller source line number
+*/
+void thd_exit_cond(MYSQL_THD thd, const PSI_stage_info *stage,
+ const char *src_function, const char *src_file,
+ int src_line);
+
+#define THD_EXIT_COND(P1, P2) \
+ thd_exit_cond(P1, P2, __func__, __FILE__, __LINE__)
+
#endif /* MYSQL_SERVER */
#endif /* SQL_CLASS_INCLUDED */