mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
- Fix for BUG#1858 "SQL-Thread stops working when using optimize table":
we change THD::system_thread from a 'bool' to a bitmap to be able to distinguish between delayed-insert threads and slave threads. - Fix for BUG#1701 "Update from multiple tables" (one line in sql_parse.cc, plus a new test rpl_multi_update.test). That's just adding an initialization.
This commit is contained in:
27
mysql-test/r/rpl_multi_update.result
Normal file
27
mysql-test/r/rpl_multi_update.result
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
slave stop;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
reset master;
|
||||||
|
reset slave;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
slave start;
|
||||||
|
drop table if exists t1,t2;
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
a int unsigned not null auto_increment primary key,
|
||||||
|
b int unsigned,
|
||||||
|
) TYPE=MyISAM;
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
a int unsigned not null auto_increment primary key,
|
||||||
|
b int unsigned
|
||||||
|
) TYPE=MyISAM;
|
||||||
|
INSERT INTO t1 VALUES (NULL, 0);
|
||||||
|
INSERT INTO t1 SELECT NULL, 0 FROM t1;
|
||||||
|
INSERT INTO t2 VALUES (NULL, 0), (NULL,1);
|
||||||
|
SELECT * FROM t1 ORDER BY a;
|
||||||
|
a b
|
||||||
|
1 0
|
||||||
|
2 0
|
||||||
|
SELECT * FROM t2 ORDER BY a;
|
||||||
|
a b
|
||||||
|
1 0
|
||||||
|
2 1
|
||||||
|
UPDATE t1, t2 SET t1.b = t2.b WHERE t1.a = t2.a;
|
25
mysql-test/t/rpl_multi_update.test
Normal file
25
mysql-test/t/rpl_multi_update.test
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
source include/master-slave.inc;
|
||||||
|
drop table if exists t1,t2;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
a int unsigned not null auto_increment primary key,
|
||||||
|
b int unsigned,
|
||||||
|
) TYPE=MyISAM;
|
||||||
|
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
a int unsigned not null auto_increment primary key,
|
||||||
|
b int unsigned
|
||||||
|
) TYPE=MyISAM;
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES (NULL, 0);
|
||||||
|
INSERT INTO t1 SELECT NULL, 0 FROM t1;
|
||||||
|
|
||||||
|
INSERT INTO t2 VALUES (NULL, 0), (NULL,1);
|
||||||
|
|
||||||
|
SELECT * FROM t1 ORDER BY a;
|
||||||
|
SELECT * FROM t2 ORDER BY a;
|
||||||
|
|
||||||
|
UPDATE t1, t2 SET t1.b = t2.b WHERE t1.a = t2.a;
|
||||||
|
save_master_pos;
|
||||||
|
connection slave;
|
||||||
|
sync_with_master;
|
@ -52,6 +52,13 @@ static Slave_log_event* find_slave_event(IO_CACHE* log,
|
|||||||
const char* log_file_name,
|
const char* log_file_name,
|
||||||
char* errmsg);
|
char* errmsg);
|
||||||
|
|
||||||
|
/*
|
||||||
|
All of the functions defined in this file which are not used (the ones to
|
||||||
|
handle failsafe) are not used; their code has not been updated for more than
|
||||||
|
one year now so should be considered as BADLY BROKEN. Do not enable it.
|
||||||
|
The used functions (to handle LOAD DATA FROM MASTER, plus some small
|
||||||
|
functions like register_slave()) are working.
|
||||||
|
*/
|
||||||
|
|
||||||
static int init_failsafe_rpl_thread(THD* thd)
|
static int init_failsafe_rpl_thread(THD* thd)
|
||||||
{
|
{
|
||||||
|
@ -2021,7 +2021,9 @@ improper_arguments: %d timed_out: %d",
|
|||||||
static int init_slave_thread(THD* thd, SLAVE_THD_TYPE thd_type)
|
static int init_slave_thread(THD* thd, SLAVE_THD_TYPE thd_type)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("init_slave_thread");
|
DBUG_ENTER("init_slave_thread");
|
||||||
thd->system_thread = thd->bootstrap = 1;
|
thd->system_thread = (thd_type == SLAVE_THD_SQL) ?
|
||||||
|
SYSTEM_THREAD_SLAVE_SQL : SYSTEM_THREAD_SLAVE_IO;
|
||||||
|
thd->bootstrap= 1;
|
||||||
thd->host_or_ip= "";
|
thd->host_or_ip= "";
|
||||||
thd->client_capabilities = 0;
|
thd->client_capabilities = 0;
|
||||||
my_net_init(&thd->net, 0);
|
my_net_init(&thd->net, 0);
|
||||||
|
@ -460,7 +460,7 @@ public:
|
|||||||
long dbug_thread_id;
|
long dbug_thread_id;
|
||||||
pthread_t real_id;
|
pthread_t real_id;
|
||||||
uint current_tablenr,tmp_table,cond_count;
|
uint current_tablenr,tmp_table,cond_count;
|
||||||
uint server_status,open_options;
|
uint server_status,open_options,system_thread;
|
||||||
uint32 query_length;
|
uint32 query_length;
|
||||||
uint32 db_length;
|
uint32 db_length;
|
||||||
/* variables.transaction_isolation is reset to this after each commit */
|
/* variables.transaction_isolation is reset to this after each commit */
|
||||||
@ -470,7 +470,7 @@ public:
|
|||||||
bool set_query_id,locked,count_cuted_fields,some_tables_deleted;
|
bool set_query_id,locked,count_cuted_fields,some_tables_deleted;
|
||||||
bool no_errors, allow_sum_func, password, fatal_error;
|
bool no_errors, allow_sum_func, password, fatal_error;
|
||||||
bool query_start_used,last_insert_id_used,insert_id_used,rand_used;
|
bool query_start_used,last_insert_id_used,insert_id_used,rand_used;
|
||||||
bool system_thread,in_lock_tables,global_read_lock;
|
bool in_lock_tables,global_read_lock;
|
||||||
bool query_error, bootstrap, cleanup_done;
|
bool query_error, bootstrap, cleanup_done;
|
||||||
bool safe_to_cache_query;
|
bool safe_to_cache_query;
|
||||||
bool volatile killed;
|
bool volatile killed;
|
||||||
@ -592,6 +592,11 @@ public:
|
|||||||
CHANGED_TABLE_LIST * changed_table_dup(const char *key, long key_length);
|
CHANGED_TABLE_LIST * changed_table_dup(const char *key, long key_length);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Flags for the THD::system_thread (bitmap) variable */
|
||||||
|
#define SYSTEM_THREAD_DELAYED_INSERT 1
|
||||||
|
#define SYSTEM_THREAD_SLAVE_IO 2
|
||||||
|
#define SYSTEM_THREAD_SLAVE_SQL 4
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Used to hold information about file and file structure in exchainge
|
Used to hold information about file and file structure in exchainge
|
||||||
via non-DB file (...INTO OUTFILE..., ...LOAD DATA...)
|
via non-DB file (...INTO OUTFILE..., ...LOAD DATA...)
|
||||||
|
@ -550,7 +550,7 @@ public:
|
|||||||
thd.command=COM_DELAYED_INSERT;
|
thd.command=COM_DELAYED_INSERT;
|
||||||
|
|
||||||
bzero((char*) &thd.net,sizeof(thd.net)); // Safety
|
bzero((char*) &thd.net,sizeof(thd.net)); // Safety
|
||||||
thd.system_thread=1;
|
thd.system_thread= SYSTEM_THREAD_DELAYED_INSERT;
|
||||||
thd.host_or_ip= "";
|
thd.host_or_ip= "";
|
||||||
bzero((char*) &info,sizeof(info));
|
bzero((char*) &info,sizeof(info));
|
||||||
pthread_mutex_init(&mutex,MY_MUTEX_INIT_FAST);
|
pthread_mutex_init(&mutex,MY_MUTEX_INIT_FAST);
|
||||||
|
@ -2902,6 +2902,12 @@ mysql_init_query(THD *thd)
|
|||||||
thd->lex.select_lex.table_list.first=0;
|
thd->lex.select_lex.table_list.first=0;
|
||||||
thd->lex.select_lex.table_list.next= (byte**) &thd->lex.select_lex.table_list.first;
|
thd->lex.select_lex.table_list.next= (byte**) &thd->lex.select_lex.table_list.first;
|
||||||
thd->lex.select_lex.next=0;
|
thd->lex.select_lex.next=0;
|
||||||
|
/*
|
||||||
|
select_lex.options is also inited in dispatch_command(), but for
|
||||||
|
replication (which bypasses dispatch_command() and calls mysql_parse()
|
||||||
|
directly) we must do it here.
|
||||||
|
*/
|
||||||
|
thd->lex.select_lex.options=0;
|
||||||
thd->lex.olap=0;
|
thd->lex.olap=0;
|
||||||
thd->lex.select->olap= UNSPECIFIED_OLAP_TYPE;
|
thd->lex.select->olap= UNSPECIFIED_OLAP_TYPE;
|
||||||
thd->fatal_error=0; // Safety
|
thd->fatal_error=0; // Safety
|
||||||
|
Reference in New Issue
Block a user