mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Merge MySQL->MariaDB
* Finished Monty and Jani's merge * Some InnoDB tests still fail (because it's old xtradb code run against newer testsuite). They are expected to go after mergning with the latest xtradb.
This commit is contained in:
102
sql/sql_class.h
102
sql/sql_class.h
@ -93,7 +93,7 @@ enum enum_mark_columns
|
||||
|
||||
extern char internal_table_name[2];
|
||||
extern char empty_c_string[1];
|
||||
extern const char **errmesg;
|
||||
extern MYSQL_PLUGIN_IMPORT const char **errmesg;
|
||||
|
||||
#define TC_LOG_PAGE_SIZE 8192
|
||||
#define TC_LOG_MIN_SIZE (3*TC_LOG_PAGE_SIZE)
|
||||
@ -637,22 +637,16 @@ public:
|
||||
we need to declare it char * because all table handlers are written
|
||||
in C and need to point to it.
|
||||
|
||||
Note that (A) if we set query = NULL, we must at the same time set
|
||||
query_length = 0, and protect the whole operation with the
|
||||
LOCK_thread_count mutex. And (B) we are ONLY allowed to set query to a
|
||||
non-NULL value if its previous value is NULL. We do not need to protect
|
||||
operation (B) with any mutex. To avoid crashes in races, if we do not
|
||||
know that thd->query cannot change at the moment, one should print
|
||||
Note that if we set query = NULL, we must at the same time set
|
||||
query_length = 0, and protect the whole operation with
|
||||
LOCK_thd_data mutex. To avoid crashes in races, if we do not
|
||||
know that thd->query cannot change at the moment, we should print
|
||||
thd->query like this:
|
||||
(1) reserve the LOCK_thread_count mutex;
|
||||
(2) check if thd->query is NULL;
|
||||
(3) if not NULL, then print at most thd->query_length characters from
|
||||
it. We will see the query_length field as either 0, or the right value
|
||||
for it.
|
||||
Assuming that the write and read of an n-bit memory field in an n-bit
|
||||
computer is atomic, we can avoid races in the above way.
|
||||
This printing is needed at least in SHOW PROCESSLIST and SHOW INNODB
|
||||
STATUS.
|
||||
(1) reserve the LOCK_thd_data mutex;
|
||||
(2) print or copy the value of query and query_length
|
||||
(3) release LOCK_thd_data mutex.
|
||||
This printing is needed at least in SHOW PROCESSLIST and SHOW
|
||||
ENGINE INNODB STATUS.
|
||||
*/
|
||||
char *query;
|
||||
uint32 query_length; // current query length
|
||||
@ -684,7 +678,7 @@ public:
|
||||
virtual ~Statement();
|
||||
|
||||
/* Assign execution context (note: not all members) of given stmt to self */
|
||||
void set_statement(Statement *stmt);
|
||||
virtual void set_statement(Statement *stmt);
|
||||
void set_n_backup_statement(Statement *stmt, Statement *backup);
|
||||
void restore_backup_statement(Statement *stmt, Statement *backup);
|
||||
/* return class type */
|
||||
@ -1042,7 +1036,10 @@ show_system_thread(enum_thread_type thread)
|
||||
class Internal_error_handler
|
||||
{
|
||||
protected:
|
||||
Internal_error_handler() {}
|
||||
Internal_error_handler() :
|
||||
m_prev_internal_handler(NULL)
|
||||
{}
|
||||
|
||||
virtual ~Internal_error_handler() {}
|
||||
|
||||
public:
|
||||
@ -1075,6 +1072,28 @@ public:
|
||||
const char *message,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
THD *thd) = 0;
|
||||
private:
|
||||
Internal_error_handler *m_prev_internal_handler;
|
||||
friend class THD;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
Implements the trivial error handler which cancels all error states
|
||||
and prevents an SQLSTATE to be set.
|
||||
*/
|
||||
|
||||
class Dummy_error_handler : public Internal_error_handler
|
||||
{
|
||||
public:
|
||||
bool handle_error(uint sql_errno,
|
||||
const char *message,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
THD *thd)
|
||||
{
|
||||
/* Ignore error */
|
||||
return TRUE;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -1280,7 +1299,15 @@ public:
|
||||
THR_LOCK_OWNER main_lock_id; // To use for conventional queries
|
||||
THR_LOCK_OWNER *lock_id; // If not main_lock_id, points to
|
||||
// the lock_id of a cursor.
|
||||
pthread_mutex_t LOCK_delete; // Locked before thd is deleted
|
||||
/**
|
||||
Protects THD data accessed from other threads:
|
||||
- thd->query and thd->query_length (used by SHOW ENGINE
|
||||
INNODB STATUS and SHOW PROCESSLIST
|
||||
- thd->mysys_var (used by KILL statement and shutdown).
|
||||
Is locked when THD is deleted.
|
||||
*/
|
||||
pthread_mutex_t LOCK_thd_data;
|
||||
|
||||
/* all prepared statements and cursors of this connection */
|
||||
Statement_map stmt_map;
|
||||
/*
|
||||
@ -1317,6 +1344,10 @@ public:
|
||||
|
||||
Set it using the thd_proc_info(THD *thread, const char *message)
|
||||
macro/function.
|
||||
|
||||
This member is accessed and assigned without any synchronization.
|
||||
Therefore, it may point only to constant (statically
|
||||
allocated) strings, which memory won't go away over time.
|
||||
*/
|
||||
const char *proc_info;
|
||||
|
||||
@ -1352,7 +1383,8 @@ public:
|
||||
/* remote (peer) port */
|
||||
uint16 peer_port;
|
||||
time_t start_time, user_time;
|
||||
ulonglong connect_utime, thr_create_utime; // track down slow pthread_create
|
||||
// track down slow pthread_create
|
||||
ulonglong prior_thr_create_utime, thr_create_utime;
|
||||
ulonglong start_utime, utime_after_lock;
|
||||
|
||||
thr_lock_type update_lock_default;
|
||||
@ -1447,6 +1479,14 @@ public:
|
||||
{
|
||||
changed_tables= 0;
|
||||
savepoints= 0;
|
||||
/*
|
||||
If rm_error is raised, it means that this piece of a distributed
|
||||
transaction has failed and must be rolled back. But the user must
|
||||
rollback it explicitly, so don't start a new distributed XA until
|
||||
then.
|
||||
*/
|
||||
if (!xid_state.rm_error)
|
||||
xid_state.xid.null();
|
||||
#ifdef USING_TRANSACTIONS
|
||||
free_root(&mem_root,MYF(MY_KEEP_PREALLOC));
|
||||
#endif
|
||||
@ -1862,15 +1902,15 @@ public:
|
||||
#ifdef SIGNAL_WITH_VIO_CLOSE
|
||||
inline void set_active_vio(Vio* vio)
|
||||
{
|
||||
pthread_mutex_lock(&LOCK_delete);
|
||||
pthread_mutex_lock(&LOCK_thd_data);
|
||||
active_vio = vio;
|
||||
pthread_mutex_unlock(&LOCK_delete);
|
||||
pthread_mutex_unlock(&LOCK_thd_data);
|
||||
}
|
||||
inline void clear_active_vio()
|
||||
{
|
||||
pthread_mutex_lock(&LOCK_delete);
|
||||
pthread_mutex_lock(&LOCK_thd_data);
|
||||
active_vio = 0;
|
||||
pthread_mutex_unlock(&LOCK_delete);
|
||||
pthread_mutex_unlock(&LOCK_thd_data);
|
||||
}
|
||||
void close_active_vio();
|
||||
#endif
|
||||
@ -1899,7 +1939,7 @@ public:
|
||||
int binlog_query(enum_binlog_query_type qtype,
|
||||
char const *query, ulong query_len,
|
||||
bool is_trans, bool suppress_use,
|
||||
THD::killed_state killed_err_arg= THD::KILLED_NO_VALUE);
|
||||
int errcode);
|
||||
#endif
|
||||
|
||||
/*
|
||||
@ -2220,6 +2260,9 @@ public:
|
||||
thd_scheduler event_scheduler;
|
||||
|
||||
public:
|
||||
inline Internal_error_handler *get_internal_handler()
|
||||
{ return m_internal_handler; }
|
||||
|
||||
/**
|
||||
Add an internal error handler to the thread execution context.
|
||||
@param handler the exception handler to add
|
||||
@ -2240,6 +2283,14 @@ public:
|
||||
*/
|
||||
void pop_internal_handler();
|
||||
|
||||
/** Overloaded to guard query/query_length fields */
|
||||
virtual void set_statement(Statement *stmt);
|
||||
|
||||
/**
|
||||
Assign a new value to thd->query.
|
||||
Protected with LOCK_thd_data mutex.
|
||||
*/
|
||||
void set_query(char *query_arg, uint32 query_length_arg);
|
||||
private:
|
||||
/** The current internal error handler for this thread, or NULL. */
|
||||
Internal_error_handler *m_internal_handler;
|
||||
@ -2452,6 +2503,7 @@ class select_export :public select_to_file {
|
||||
*/
|
||||
bool is_unsafe_field_sep;
|
||||
bool fixed_row_size;
|
||||
CHARSET_INFO *write_cs; // output charset
|
||||
public:
|
||||
select_export(sql_exchange *ex) :select_to_file(ex) {}
|
||||
/**
|
||||
|
Reference in New Issue
Block a user