Loading client/mysqltest.c +41 −9 Original line number Diff line number Diff line Loading @@ -113,7 +113,7 @@ struct query enum {Q_CONNECTION, Q_QUERY, Q_CONNECT, Q_SLEEP, Q_INC, Q_DEC,Q_SOURCE, Q_DISCONNECT,Q_LET, Q_ECHO, Q_WHILE, Q_END_BLOCK, Q_UNKNOWN} type; Q_SYSTEM, Q_UNKNOWN} type; }; #define DS_CHUNK 16384 Loading Loading @@ -330,11 +330,21 @@ int do_source(struct query* q) int eval_expr(VAR* v, char* p, char* p_end) { VAR* vp; if(*p == '$') { if((vp = var_get(p,p_end,0))) { memcpy(v, vp, sizeof(VAR)); return 0; } } else { v->str_val = p; v->str_val_len = p_end ? p_end - p : strlen(p); return 0; } if(p_end) *p_end = 0; die("Invalid expr: %s", p); Loading Loading @@ -365,6 +375,25 @@ int do_dec(struct query* q) return 0; } int do_system(struct query* q) { char* p; VAR v; p = (char*)q->q + q->first_word_len; while(*p && isspace(*p)) p++; eval_expr(&v, p, 0); /* NULL terminated */ if(v.str_val_len > 1) { char expr_buf[512]; if((uint)v.str_val_len > sizeof(expr_buf) - 1) v.str_val_len = sizeof(expr_buf) - 1; memcpy(expr_buf, v.str_val, v.str_val_len); expr_buf[v.str_val_len] = 0; if(system(expr_buf) && q->abort_on_error) die("system command '%s' failed", expr_buf); } return 0; } int do_echo(struct query* q) { Loading Loading @@ -1006,7 +1035,6 @@ void reject_dump(const char* record_file, char* buf, int size) { char reject_file[MAX_RECORD_FILE+16]; char* p; FILE* freject; p = reject_file; p = safe_str_append(p, record_file, sizeof(reject_file)); Loading @@ -1021,7 +1049,6 @@ int run_query(MYSQL* mysql, struct query* q) MYSQL_FIELD* fields; MYSQL_ROW row; int num_fields,i, error = 0; struct stat info; unsigned long* lengths; char* val; int len; Loading Loading @@ -1181,6 +1208,8 @@ void get_query_type(struct query* q) case 6: if(check_first_word(q, "source", 6)) q->type = Q_SOURCE; else if(check_first_word(q, "system", 6)) q->type = Q_SYSTEM; break; case 7: if(check_first_word(q, "connect", 7)) Loading Loading @@ -1254,6 +1283,7 @@ int main(int argc, char** argv) case Q_INC: do_inc(q); break; case Q_DEC: do_dec(q); break; case Q_ECHO: do_echo(q); break; case Q_SYSTEM: do_system(q); break; case Q_LET: do_let(q); break; case Q_QUERY: error |= run_query(&cur_con->mysql, q); break; default: processed = 0; break; Loading @@ -1277,10 +1307,12 @@ int main(int argc, char** argv) close_cons(); if(result_file) { if(!record && ds_res.len) error |= check_result(&ds_res, result_file); else str_to_file(result_file, ds_res.str, ds_res.len); } dyn_string_end(&ds_res); if (!silent) { Loading myisammrg/myrg_open.c +4 −4 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ int handle_locking; DBUG_ENTER("myrg_open"); LINT_INIT(last_isam); LINT_INIT(m_info); isam=0; errpos=files=0; bzero((gptr) &info,sizeof(info)); Loading Loading @@ -84,7 +85,7 @@ int handle_locking; MYF(MY_WME)))) goto err; *m_info=info; m_info->open_tables=(MYRG_TABLE *) (m_info+1); m_info->open_tables=(files) ? (MYRG_TABLE *) (m_info+1) : 0; m_info->tables=files; errpos=2; Loading @@ -110,11 +111,10 @@ int handle_locking; my_errno=HA_ERR_RECORD_FILE_FULL; goto err; } if (files) m_info->keys=m_info->open_tables->table->s->base.keys; m_info->keys=(files) ? m_info->open_tables->table->s->base.keys : 0; bzero((char*) &m_info->by_key,sizeof(m_info->by_key)); /* this works ok if the table list is empty */ m_info->end_table=m_info->open_tables+files; m_info->last_used_table=m_info->open_tables; Loading mysql-test/r/rpl000016.result 0 → 100644 +3 −0 Original line number Diff line number Diff line s Could not break slave Tried hard mysql-test/t/rpl000016-slave-master-info.opt 0 → 100644 +1 −0 Original line number Diff line number Diff line --server-id=2 mysql-test/t/rpl000016.test 0 → 100644 +19 −0 Original line number Diff line number Diff line connect (master,localhost,root,,test,0,var/tmp/mysql.sock); connect (slave,localhost,root,,test,0,var/tmp/mysql-slave.sock); system cat /dev/null > var/slave-data/master.info; system chmod 000 var/slave-data/master.info; connection slave; !slave start; system chmod 600 var/slave-data/master.info; !slave start; !change master to master_host='127.0.0.1',master_port=9306,master_user='root'; reset slave; !change master to master_host='127.0.0.1',master_port=9306,master_user='root'; slave start; connection master; drop table if exists foo; create table foo(s text); insert into foo values('Could not break slave'),('Tried hard'); connection slave; sleep 0.3; select * from foo; Loading
client/mysqltest.c +41 −9 Original line number Diff line number Diff line Loading @@ -113,7 +113,7 @@ struct query enum {Q_CONNECTION, Q_QUERY, Q_CONNECT, Q_SLEEP, Q_INC, Q_DEC,Q_SOURCE, Q_DISCONNECT,Q_LET, Q_ECHO, Q_WHILE, Q_END_BLOCK, Q_UNKNOWN} type; Q_SYSTEM, Q_UNKNOWN} type; }; #define DS_CHUNK 16384 Loading Loading @@ -330,11 +330,21 @@ int do_source(struct query* q) int eval_expr(VAR* v, char* p, char* p_end) { VAR* vp; if(*p == '$') { if((vp = var_get(p,p_end,0))) { memcpy(v, vp, sizeof(VAR)); return 0; } } else { v->str_val = p; v->str_val_len = p_end ? p_end - p : strlen(p); return 0; } if(p_end) *p_end = 0; die("Invalid expr: %s", p); Loading Loading @@ -365,6 +375,25 @@ int do_dec(struct query* q) return 0; } int do_system(struct query* q) { char* p; VAR v; p = (char*)q->q + q->first_word_len; while(*p && isspace(*p)) p++; eval_expr(&v, p, 0); /* NULL terminated */ if(v.str_val_len > 1) { char expr_buf[512]; if((uint)v.str_val_len > sizeof(expr_buf) - 1) v.str_val_len = sizeof(expr_buf) - 1; memcpy(expr_buf, v.str_val, v.str_val_len); expr_buf[v.str_val_len] = 0; if(system(expr_buf) && q->abort_on_error) die("system command '%s' failed", expr_buf); } return 0; } int do_echo(struct query* q) { Loading Loading @@ -1006,7 +1035,6 @@ void reject_dump(const char* record_file, char* buf, int size) { char reject_file[MAX_RECORD_FILE+16]; char* p; FILE* freject; p = reject_file; p = safe_str_append(p, record_file, sizeof(reject_file)); Loading @@ -1021,7 +1049,6 @@ int run_query(MYSQL* mysql, struct query* q) MYSQL_FIELD* fields; MYSQL_ROW row; int num_fields,i, error = 0; struct stat info; unsigned long* lengths; char* val; int len; Loading Loading @@ -1181,6 +1208,8 @@ void get_query_type(struct query* q) case 6: if(check_first_word(q, "source", 6)) q->type = Q_SOURCE; else if(check_first_word(q, "system", 6)) q->type = Q_SYSTEM; break; case 7: if(check_first_word(q, "connect", 7)) Loading Loading @@ -1254,6 +1283,7 @@ int main(int argc, char** argv) case Q_INC: do_inc(q); break; case Q_DEC: do_dec(q); break; case Q_ECHO: do_echo(q); break; case Q_SYSTEM: do_system(q); break; case Q_LET: do_let(q); break; case Q_QUERY: error |= run_query(&cur_con->mysql, q); break; default: processed = 0; break; Loading @@ -1277,10 +1307,12 @@ int main(int argc, char** argv) close_cons(); if(result_file) { if(!record && ds_res.len) error |= check_result(&ds_res, result_file); else str_to_file(result_file, ds_res.str, ds_res.len); } dyn_string_end(&ds_res); if (!silent) { Loading
myisammrg/myrg_open.c +4 −4 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ int handle_locking; DBUG_ENTER("myrg_open"); LINT_INIT(last_isam); LINT_INIT(m_info); isam=0; errpos=files=0; bzero((gptr) &info,sizeof(info)); Loading Loading @@ -84,7 +85,7 @@ int handle_locking; MYF(MY_WME)))) goto err; *m_info=info; m_info->open_tables=(MYRG_TABLE *) (m_info+1); m_info->open_tables=(files) ? (MYRG_TABLE *) (m_info+1) : 0; m_info->tables=files; errpos=2; Loading @@ -110,11 +111,10 @@ int handle_locking; my_errno=HA_ERR_RECORD_FILE_FULL; goto err; } if (files) m_info->keys=m_info->open_tables->table->s->base.keys; m_info->keys=(files) ? m_info->open_tables->table->s->base.keys : 0; bzero((char*) &m_info->by_key,sizeof(m_info->by_key)); /* this works ok if the table list is empty */ m_info->end_table=m_info->open_tables+files; m_info->last_used_table=m_info->open_tables; Loading
mysql-test/r/rpl000016.result 0 → 100644 +3 −0 Original line number Diff line number Diff line s Could not break slave Tried hard
mysql-test/t/rpl000016-slave-master-info.opt 0 → 100644 +1 −0 Original line number Diff line number Diff line --server-id=2
mysql-test/t/rpl000016.test 0 → 100644 +19 −0 Original line number Diff line number Diff line connect (master,localhost,root,,test,0,var/tmp/mysql.sock); connect (slave,localhost,root,,test,0,var/tmp/mysql-slave.sock); system cat /dev/null > var/slave-data/master.info; system chmod 000 var/slave-data/master.info; connection slave; !slave start; system chmod 600 var/slave-data/master.info; !slave start; !change master to master_host='127.0.0.1',master_port=9306,master_user='root'; reset slave; !change master to master_host='127.0.0.1',master_port=9306,master_user='root'; slave start; connection master; drop table if exists foo; create table foo(s text); insert into foo values('Could not break slave'),('Tried hard'); connection slave; sleep 0.3; select * from foo;