mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 18:41:56 +01:00
Merge
client/mysqldump.c: Auto merged sql/handler.cc: Auto merged sql/log_event.cc: Auto merged sql/sql_parse.cc: Auto merged sql/sql_yacc.yy: Auto merged sql/handler.h: SCCS merged
This commit is contained in:
commit
3b3285b322
39 changed files with 394 additions and 159 deletions
|
@ -37,7 +37,7 @@
|
||||||
** 10 Jun 2003: SET NAMES and --no-set-names by Alexander Barkov
|
** 10 Jun 2003: SET NAMES and --no-set-names by Alexander Barkov
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define DUMP_VERSION "10.8"
|
#define DUMP_VERSION "10.9"
|
||||||
|
|
||||||
#include <my_global.h>
|
#include <my_global.h>
|
||||||
#include <my_sys.h>
|
#include <my_sys.h>
|
||||||
|
@ -78,8 +78,8 @@ static my_bool verbose=0,tFlag=0,cFlag=0,dFlag=0,quick= 1, extended_insert= 1,
|
||||||
lock_tables=1,ignore_errors=0,flush_logs=0,replace=0,
|
lock_tables=1,ignore_errors=0,flush_logs=0,replace=0,
|
||||||
ignore=0,opt_drop=1,opt_keywords=0,opt_lock=1,opt_compress=0,
|
ignore=0,opt_drop=1,opt_keywords=0,opt_lock=1,opt_compress=0,
|
||||||
opt_delayed=0,create_options=1,opt_quoted=0,opt_databases=0,
|
opt_delayed=0,create_options=1,opt_quoted=0,opt_databases=0,
|
||||||
opt_alldbs=0,opt_create_db=0,opt_first_slave=0,opt_set_charset,
|
opt_alldbs=0,opt_create_db=0,opt_lock_all_tables=0,opt_set_charset,
|
||||||
opt_autocommit=0,opt_master_data,opt_disable_keys=1,opt_xml=0,
|
opt_autocommit=0,opt_disable_keys=1,opt_xml=0,
|
||||||
opt_delete_master_logs=0, tty_password=0,
|
opt_delete_master_logs=0, tty_password=0,
|
||||||
opt_single_transaction=0, opt_comments= 0, opt_compact= 0,
|
opt_single_transaction=0, opt_comments= 0, opt_compact= 0,
|
||||||
opt_hex_blob=0;
|
opt_hex_blob=0;
|
||||||
|
@ -93,7 +93,9 @@ static char insert_pat[12 * 1024],*opt_password=0,*current_user=0,
|
||||||
*err_ptr= 0;
|
*err_ptr= 0;
|
||||||
static char compatible_mode_normal_str[255];
|
static char compatible_mode_normal_str[255];
|
||||||
static ulong opt_compatible_mode= 0;
|
static ulong opt_compatible_mode= 0;
|
||||||
static uint opt_mysql_port= 0, err_len= 0;
|
#define MYSQL_OPT_MASTER_DATA_EFFECTIVE_SQL 1
|
||||||
|
#define MYSQL_OPT_MASTER_DATA_COMMENTED_SQL 2
|
||||||
|
static uint opt_mysql_port= 0, err_len= 0, opt_master_data;
|
||||||
static my_string opt_mysql_unix_port=0;
|
static my_string opt_mysql_unix_port=0;
|
||||||
static int first_error=0;
|
static int first_error=0;
|
||||||
static DYNAMIC_STRING extended_row;
|
static DYNAMIC_STRING extended_row;
|
||||||
|
@ -183,8 +185,9 @@ static struct my_option my_long_options[] =
|
||||||
(gptr*) &opt_delayed, (gptr*) &opt_delayed, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
|
(gptr*) &opt_delayed, (gptr*) &opt_delayed, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
|
||||||
0, 0},
|
0, 0},
|
||||||
{"delete-master-logs", OPT_DELETE_MASTER_LOGS,
|
{"delete-master-logs", OPT_DELETE_MASTER_LOGS,
|
||||||
"Delete logs on master after backup. This automatically enables --first-slave.",
|
"Delete logs on master after backup. This automatically enables --master-data.",
|
||||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
(gptr*) &opt_delete_master_logs, (gptr*) &opt_delete_master_logs, 0,
|
||||||
|
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"disable-keys", 'K',
|
{"disable-keys", 'K',
|
||||||
"'/*!40000 ALTER TABLE tb_name DISABLE KEYS */; and '/*!40000 ALTER TABLE tb_name ENABLE KEYS */; will be put in the output.", (gptr*) &opt_disable_keys,
|
"'/*!40000 ALTER TABLE tb_name DISABLE KEYS */; and '/*!40000 ALTER TABLE tb_name ENABLE KEYS */; will be put in the output.", (gptr*) &opt_disable_keys,
|
||||||
(gptr*) &opt_disable_keys, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
|
(gptr*) &opt_disable_keys, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
|
||||||
|
@ -203,13 +206,18 @@ static struct my_option my_long_options[] =
|
||||||
(gptr*) &opt_enclosed, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0 ,0, 0},
|
(gptr*) &opt_enclosed, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0 ,0, 0},
|
||||||
{"fields-escaped-by", OPT_ESC, "Fields in the i.file are escaped by ...",
|
{"fields-escaped-by", OPT_ESC, "Fields in the i.file are escaped by ...",
|
||||||
(gptr*) &escaped, (gptr*) &escaped, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
(gptr*) &escaped, (gptr*) &escaped, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"first-slave", 'x', "Locks all tables across all databases.",
|
{"first-slave", 'x', "Deprecated, renamed to --lock-all-tables.",
|
||||||
(gptr*) &opt_first_slave, (gptr*) &opt_first_slave, 0, GET_BOOL, NO_ARG,
|
(gptr*) &opt_lock_all_tables, (gptr*) &opt_lock_all_tables, 0, GET_BOOL, NO_ARG,
|
||||||
0, 0, 0, 0, 0, 0},
|
0, 0, 0, 0, 0, 0},
|
||||||
{"flush-logs", 'F', "Flush logs file in server before starting dump. "
|
{"flush-logs", 'F', "Flush logs file in server before starting dump. "
|
||||||
"Note that if you dump many databases at once (using the option "
|
"Note that if you dump many databases at once (using the option "
|
||||||
"--databases= or --all-databases), the logs will be flushed for "
|
"--databases= or --all-databases), the logs will be flushed for "
|
||||||
"each database dumped.",
|
"each database dumped. The exception is when using --lock-all-tables "
|
||||||
|
"or --master-data: "
|
||||||
|
"in this case the logs will be flushed only once, corresponding "
|
||||||
|
"to the moment all tables are locked. So if you want your dump and "
|
||||||
|
"the log flush to happen at the same exact moment you should use "
|
||||||
|
"--lock-all-tables or --master-data with --flush-logs",
|
||||||
(gptr*) &flush_logs, (gptr*) &flush_logs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
|
(gptr*) &flush_logs, (gptr*) &flush_logs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
|
||||||
0, 0},
|
0, 0},
|
||||||
{"force", 'f', "Continue even if we get an sql-error.",
|
{"force", 'f', "Continue even if we get an sql-error.",
|
||||||
|
@ -222,17 +230,40 @@ static struct my_option my_long_options[] =
|
||||||
{"lines-terminated-by", OPT_LTB, "Lines in the i.file are terminated by ...",
|
{"lines-terminated-by", OPT_LTB, "Lines in the i.file are terminated by ...",
|
||||||
(gptr*) &lines_terminated, (gptr*) &lines_terminated, 0, GET_STR,
|
(gptr*) &lines_terminated, (gptr*) &lines_terminated, 0, GET_STR,
|
||||||
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
|
{"lock-all-tables", 'x', "Locks all tables across all databases. This "
|
||||||
|
"is achieved by taking a global read lock for the duration of the whole "
|
||||||
|
"dump. Automatically turns --single-transaction and --lock-tables off.",
|
||||||
|
(gptr*) &opt_lock_all_tables, (gptr*) &opt_lock_all_tables, 0, GET_BOOL, NO_ARG,
|
||||||
|
0, 0, 0, 0, 0, 0},
|
||||||
{"lock-tables", 'l', "Lock all tables for read.", (gptr*) &lock_tables,
|
{"lock-tables", 'l', "Lock all tables for read.", (gptr*) &lock_tables,
|
||||||
(gptr*) &lock_tables, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
|
(gptr*) &lock_tables, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
|
||||||
{"master-data", OPT_MASTER_DATA,
|
{"master-data", OPT_MASTER_DATA,
|
||||||
"This causes the master position and filename to be appended to your output. This automatically enables --first-slave.",
|
"This causes the binary log position and filename to be appended to the "
|
||||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
"output. If equal to 1, will print it as a CHANGE MASTER command; if equal"
|
||||||
|
" to 2, that command will be prefixed with a comment symbol. "
|
||||||
|
"This option will turn --lock-all-tables on, unless "
|
||||||
|
"--single-transaction is specified too (in which case a "
|
||||||
|
"global read lock is only taken a short time at the beginning of the dump "
|
||||||
|
"- don't forget to read about --single-transaction below). In all cases "
|
||||||
|
"any action on logs will happen at the exact moment of the dump."
|
||||||
|
"Option automatically turns --lock-tables off.",
|
||||||
|
(gptr*) &opt_master_data, (gptr*) &opt_master_data, 0,
|
||||||
|
GET_UINT, REQUIRED_ARG, 0, 0, MYSQL_OPT_MASTER_DATA_COMMENTED_SQL, 0, 0, 0},
|
||||||
{"no-autocommit", OPT_AUTOCOMMIT,
|
{"no-autocommit", OPT_AUTOCOMMIT,
|
||||||
"Wrap tables with autocommit/commit statements.",
|
"Wrap tables with autocommit/commit statements.",
|
||||||
(gptr*) &opt_autocommit, (gptr*) &opt_autocommit, 0, GET_BOOL, NO_ARG,
|
(gptr*) &opt_autocommit, (gptr*) &opt_autocommit, 0, GET_BOOL, NO_ARG,
|
||||||
0, 0, 0, 0, 0, 0},
|
0, 0, 0, 0, 0, 0},
|
||||||
|
/*
|
||||||
|
Note that the combination --single-transaction --master-data
|
||||||
|
will give bullet-proof binlog position only if server >=4.1.3. That's the
|
||||||
|
old "FLUSH TABLES WITH READ LOCK does not block commit" fixed bug.
|
||||||
|
*/
|
||||||
{"single-transaction", OPT_TRANSACTION,
|
{"single-transaction", OPT_TRANSACTION,
|
||||||
"Dump all tables in single transaction to get consistent snapshot. Mutually exclusive with --lock-tables.",
|
"Creates a consistent snapshot by dumping all tables in a single "
|
||||||
|
"transaction. Works ONLY for tables stored in storage engines which "
|
||||||
|
"support multiversioning (currently only InnoDB does); the dump is NOT "
|
||||||
|
"guaranteed to be consistent for other storage engines. Option "
|
||||||
|
"automatically turns off --lock-tables.",
|
||||||
(gptr*) &opt_single_transaction, (gptr*) &opt_single_transaction, 0,
|
(gptr*) &opt_single_transaction, (gptr*) &opt_single_transaction, 0,
|
||||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"no-create-db", 'n',
|
{"no-create-db", 'n',
|
||||||
|
@ -472,14 +503,6 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
||||||
char *argument)
|
char *argument)
|
||||||
{
|
{
|
||||||
switch (optid) {
|
switch (optid) {
|
||||||
case OPT_MASTER_DATA:
|
|
||||||
opt_master_data=1;
|
|
||||||
opt_first_slave=1;
|
|
||||||
break;
|
|
||||||
case OPT_DELETE_MASTER_LOGS:
|
|
||||||
opt_delete_master_logs=1;
|
|
||||||
opt_first_slave=1;
|
|
||||||
break;
|
|
||||||
case 'p':
|
case 'p':
|
||||||
if (argument)
|
if (argument)
|
||||||
{
|
{
|
||||||
|
@ -527,7 +550,6 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
||||||
case (int) OPT_OPTIMIZE:
|
case (int) OPT_OPTIMIZE:
|
||||||
extended_insert= opt_drop= opt_lock= quick= create_options=
|
extended_insert= opt_drop= opt_lock= quick= create_options=
|
||||||
opt_disable_keys= lock_tables= opt_set_charset= 1;
|
opt_disable_keys= lock_tables= opt_set_charset= 1;
|
||||||
if (opt_single_transaction) lock_tables=0;
|
|
||||||
break;
|
break;
|
||||||
case (int) OPT_SKIP_OPTIMIZATION:
|
case (int) OPT_SKIP_OPTIMIZATION:
|
||||||
extended_insert= opt_drop= opt_lock= quick= create_options=
|
extended_insert= opt_drop= opt_lock= quick= create_options=
|
||||||
|
@ -623,7 +645,19 @@ static int get_options(int *argc, char ***argv)
|
||||||
"%s: You must use option --tab with --fields-...\n", my_progname);
|
"%s: You must use option --tab with --fields-...\n", my_progname);
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
if (opt_single_transaction)
|
|
||||||
|
/* Ensure consistency of the set of binlog & locking options */
|
||||||
|
if (opt_delete_master_logs && !opt_master_data)
|
||||||
|
opt_master_data= MYSQL_OPT_MASTER_DATA_COMMENTED_SQL;
|
||||||
|
if (opt_single_transaction && opt_lock_all_tables)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: You can't use --single-transaction and "
|
||||||
|
"--lock-all-tables at the same time.\n", my_progname);
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
if (opt_master_data)
|
||||||
|
opt_lock_all_tables= !opt_single_transaction;
|
||||||
|
if (opt_single_transaction || opt_lock_all_tables)
|
||||||
lock_tables= 0;
|
lock_tables= 0;
|
||||||
if (enclosed && opt_enclosed)
|
if (enclosed && opt_enclosed)
|
||||||
{
|
{
|
||||||
|
@ -670,6 +704,36 @@ static void DBerror(MYSQL *mysql, const char *when)
|
||||||
} /* DBerror */
|
} /* DBerror */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Sends a query to server, optionally reads result, prints error message if
|
||||||
|
some.
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
mysql_query_with_error_report()
|
||||||
|
mysql_con connection to use
|
||||||
|
res if non zero, result will be put there with mysql_store_result
|
||||||
|
query query to send to server
|
||||||
|
|
||||||
|
RETURN VALUES
|
||||||
|
0 query sending and (if res!=0) result reading went ok
|
||||||
|
1 error
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int mysql_query_with_error_report(MYSQL *mysql_con, MYSQL_RES **res,
|
||||||
|
const char *query)
|
||||||
|
{
|
||||||
|
if (mysql_query(mysql_con, query) ||
|
||||||
|
(res && !((*res)= mysql_store_result(mysql_con))))
|
||||||
|
{
|
||||||
|
my_printf_error(0, "%s: Couldn't execute '%s': %s (%d)",
|
||||||
|
MYF(0), my_progname, query,
|
||||||
|
mysql_error(mysql_con), mysql_errno(mysql_con));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void safe_exit(int error)
|
static void safe_exit(int error)
|
||||||
{
|
{
|
||||||
if (!first_error)
|
if (!first_error)
|
||||||
|
@ -717,12 +781,15 @@ static int dbConnect(char *host, char *user,char *passwd)
|
||||||
DBerror(&mysql_connection, "when trying to connect");
|
DBerror(&mysql_connection, "when trying to connect");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
As we're going to set SQL_MODE, it would be lost on reconnect, so we
|
||||||
|
cannot reconnect.
|
||||||
|
*/
|
||||||
|
sock->reconnect= 0;
|
||||||
sprintf(buff, "/*!40100 SET @@SQL_MODE=\"%s\" */",
|
sprintf(buff, "/*!40100 SET @@SQL_MODE=\"%s\" */",
|
||||||
compatible_mode_normal_str);
|
compatible_mode_normal_str);
|
||||||
if (mysql_query(sock, buff))
|
if (mysql_query_with_error_report(sock, 0, buff))
|
||||||
{
|
{
|
||||||
fprintf(stderr, "%s: Can't set the compatible mode %s (error %s)\n",
|
|
||||||
my_progname, compatible_mode_normal_str, mysql_error(sock));
|
|
||||||
mysql_close(sock);
|
mysql_close(sock);
|
||||||
safe_exit(EX_MYSQLERR);
|
safe_exit(EX_MYSQLERR);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -961,7 +1028,7 @@ static uint getTableStructure(char *table, char* db)
|
||||||
|
|
||||||
result_table= quote_name(table, table_buff, 1);
|
result_table= quote_name(table, table_buff, 1);
|
||||||
opt_quoted_table= quote_name(table, table_buff2, 0);
|
opt_quoted_table= quote_name(table, table_buff2, 0);
|
||||||
if (!opt_xml && !mysql_query(sock,insert_pat))
|
if (!opt_xml && !mysql_query_with_error_report(sock, 0, insert_pat))
|
||||||
{
|
{
|
||||||
/* using SHOW CREATE statement */
|
/* using SHOW CREATE statement */
|
||||||
if (!tFlag)
|
if (!tFlag)
|
||||||
|
@ -970,10 +1037,8 @@ static uint getTableStructure(char *table, char* db)
|
||||||
char buff[20+FN_REFLEN];
|
char buff[20+FN_REFLEN];
|
||||||
|
|
||||||
sprintf(buff,"show create table %s", result_table);
|
sprintf(buff,"show create table %s", result_table);
|
||||||
if (mysql_query(sock, buff))
|
if (mysql_query_with_error_report(sock, 0, buff))
|
||||||
{
|
{
|
||||||
fprintf(stderr, "%s: Can't get CREATE TABLE for table %s (%s)\n",
|
|
||||||
my_progname, result_table, mysql_error(sock));
|
|
||||||
safe_exit(EX_MYSQLERR);
|
safe_exit(EX_MYSQLERR);
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
@ -1010,10 +1075,8 @@ static uint getTableStructure(char *table, char* db)
|
||||||
mysql_free_result(tableRes);
|
mysql_free_result(tableRes);
|
||||||
}
|
}
|
||||||
sprintf(insert_pat,"show fields from %s", result_table);
|
sprintf(insert_pat,"show fields from %s", result_table);
|
||||||
if (mysql_query(sock,insert_pat) || !(tableRes=mysql_store_result(sock)))
|
if (mysql_query_with_error_report(sock, &tableRes, insert_pat))
|
||||||
{
|
{
|
||||||
fprintf(stderr, "%s: Can't get info about table: %s\nerror: %s\n",
|
|
||||||
my_progname, result_table, mysql_error(sock));
|
|
||||||
if (path)
|
if (path)
|
||||||
my_fclose(sql_file, MYF(MY_WME));
|
my_fclose(sql_file, MYF(MY_WME));
|
||||||
safe_exit(EX_MYSQLERR);
|
safe_exit(EX_MYSQLERR);
|
||||||
|
@ -1053,10 +1116,8 @@ static uint getTableStructure(char *table, char* db)
|
||||||
my_progname, mysql_error(sock));
|
my_progname, mysql_error(sock));
|
||||||
|
|
||||||
sprintf(insert_pat,"show fields from %s", result_table);
|
sprintf(insert_pat,"show fields from %s", result_table);
|
||||||
if (mysql_query(sock,insert_pat) || !(tableRes=mysql_store_result(sock)))
|
if (mysql_query_with_error_report(sock, &tableRes, insert_pat))
|
||||||
{
|
{
|
||||||
fprintf(stderr, "%s: Can't get info about table: %s\nerror: %s\n",
|
|
||||||
my_progname, result_table, mysql_error(sock));
|
|
||||||
safe_exit(EX_MYSQLERR);
|
safe_exit(EX_MYSQLERR);
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
@ -1150,17 +1211,14 @@ static uint getTableStructure(char *table, char* db)
|
||||||
char buff[20+FN_REFLEN];
|
char buff[20+FN_REFLEN];
|
||||||
uint keynr,primary_key;
|
uint keynr,primary_key;
|
||||||
sprintf(buff,"show keys from %s", result_table);
|
sprintf(buff,"show keys from %s", result_table);
|
||||||
if (mysql_query(sock, buff))
|
if (mysql_query_with_error_report(sock, &tableRes, buff))
|
||||||
{
|
{
|
||||||
fprintf(stderr, "%s: Can't get keys for table %s (%s)\n",
|
|
||||||
my_progname, result_table, mysql_error(sock));
|
|
||||||
if (path)
|
if (path)
|
||||||
my_fclose(sql_file, MYF(MY_WME));
|
my_fclose(sql_file, MYF(MY_WME));
|
||||||
safe_exit(EX_MYSQLERR);
|
safe_exit(EX_MYSQLERR);
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
tableRes=mysql_store_result(sock);
|
|
||||||
/* Find first which key is primary key */
|
/* Find first which key is primary key */
|
||||||
keynr=0;
|
keynr=0;
|
||||||
primary_key=INT_MAX;
|
primary_key=INT_MAX;
|
||||||
|
@ -1224,7 +1282,7 @@ static uint getTableStructure(char *table, char* db)
|
||||||
char show_name_buff[FN_REFLEN];
|
char show_name_buff[FN_REFLEN];
|
||||||
sprintf(buff,"show table status like %s",
|
sprintf(buff,"show table status like %s",
|
||||||
quote_for_like(table, show_name_buff));
|
quote_for_like(table, show_name_buff));
|
||||||
if (mysql_query(sock, buff))
|
if (mysql_query_with_error_report(sock, &tableRes, buff))
|
||||||
{
|
{
|
||||||
if (mysql_errno(sock) != ER_PARSE_ERROR)
|
if (mysql_errno(sock) != ER_PARSE_ERROR)
|
||||||
{ /* If old MySQL version */
|
{ /* If old MySQL version */
|
||||||
|
@ -1234,8 +1292,7 @@ static uint getTableStructure(char *table, char* db)
|
||||||
result_table,mysql_error(sock));
|
result_table,mysql_error(sock));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!(tableRes=mysql_store_result(sock)) ||
|
else if (!(row=mysql_fetch_row(tableRes)))
|
||||||
!(row=mysql_fetch_row(tableRes)))
|
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Error: Couldn't read status information for table %s (%s)\n",
|
"Error: Couldn't read status information for table %s (%s)\n",
|
||||||
|
@ -1439,22 +1496,14 @@ static void dumpTable(uint numFields, char *table)
|
||||||
fputs("\n", md_result_file);
|
fputs("\n", md_result_file);
|
||||||
check_io(md_result_file);
|
check_io(md_result_file);
|
||||||
}
|
}
|
||||||
if (mysql_query(sock, query))
|
if (mysql_query_with_error_report(sock, 0, query))
|
||||||
{
|
|
||||||
DBerror(sock, "when retrieving data from server");
|
DBerror(sock, "when retrieving data from server");
|
||||||
error= EX_CONSCHECK;
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
if (quick)
|
if (quick)
|
||||||
res=mysql_use_result(sock);
|
res=mysql_use_result(sock);
|
||||||
else
|
else
|
||||||
res=mysql_store_result(sock);
|
res=mysql_store_result(sock);
|
||||||
if (!res)
|
if (!res)
|
||||||
{
|
|
||||||
DBerror(sock, "when retrieving data from server");
|
DBerror(sock, "when retrieving data from server");
|
||||||
error= EX_CONSCHECK;
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
if (verbose)
|
if (verbose)
|
||||||
fprintf(stderr, "-- Retrieving rows...\n");
|
fprintf(stderr, "-- Retrieving rows...\n");
|
||||||
if (mysql_num_fields(res) != numFields)
|
if (mysql_num_fields(res) != numFields)
|
||||||
|
@ -1789,13 +1838,8 @@ static int dump_all_databases()
|
||||||
MYSQL_RES *tableres;
|
MYSQL_RES *tableres;
|
||||||
int result=0;
|
int result=0;
|
||||||
|
|
||||||
if (mysql_query(sock, "SHOW DATABASES") ||
|
if (mysql_query_with_error_report(sock, &tableres, "SHOW DATABASES"))
|
||||||
!(tableres = mysql_store_result(sock)))
|
|
||||||
{
|
|
||||||
my_printf_error(0, "Error: Couldn't execute 'SHOW DATABASES': %s",
|
|
||||||
MYF(0), mysql_error(sock));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
|
||||||
while ((row = mysql_fetch_row(tableres)))
|
while ((row = mysql_fetch_row(tableres)))
|
||||||
{
|
{
|
||||||
if (dump_all_tables_in_db(row[0]))
|
if (dump_all_tables_in_db(row[0]))
|
||||||
|
@ -1848,7 +1892,7 @@ static int init_dumping(char *database)
|
||||||
sprintf(qbuf,"SHOW CREATE DATABASE WITH IF NOT EXISTS %s",
|
sprintf(qbuf,"SHOW CREATE DATABASE WITH IF NOT EXISTS %s",
|
||||||
qdatabase);
|
qdatabase);
|
||||||
|
|
||||||
if (mysql_query(sock, qbuf) || !(dbinfo = mysql_store_result(sock)))
|
if (mysql_query_with_error_report(sock, &dbinfo, qbuf))
|
||||||
{
|
{
|
||||||
/* Old server version, dump generic CREATE DATABASE */
|
/* Old server version, dump generic CREATE DATABASE */
|
||||||
fprintf(md_result_file,
|
fprintf(md_result_file,
|
||||||
|
@ -1917,7 +1961,7 @@ static int dump_all_tables_in_db(char *database)
|
||||||
check_io(md_result_file);
|
check_io(md_result_file);
|
||||||
}
|
}
|
||||||
if (lock_tables)
|
if (lock_tables)
|
||||||
mysql_query(sock,"UNLOCK TABLES");
|
mysql_query_with_error_report(sock, 0, "UNLOCK TABLES");
|
||||||
return 0;
|
return 0;
|
||||||
} /* dump_all_tables_in_db */
|
} /* dump_all_tables_in_db */
|
||||||
|
|
||||||
|
@ -1966,11 +2010,76 @@ static int dump_selected_tables(char *db, char **table_names, int tables)
|
||||||
check_io(md_result_file);
|
check_io(md_result_file);
|
||||||
}
|
}
|
||||||
if (lock_tables)
|
if (lock_tables)
|
||||||
mysql_query(sock,"UNLOCK TABLES");
|
mysql_query_with_error_report(sock, 0, "UNLOCK TABLES");
|
||||||
return 0;
|
return 0;
|
||||||
} /* dump_selected_tables */
|
} /* dump_selected_tables */
|
||||||
|
|
||||||
|
|
||||||
|
static int do_show_master_status(MYSQL *mysql_con)
|
||||||
|
{
|
||||||
|
MYSQL_ROW row;
|
||||||
|
MYSQL_RES *master;
|
||||||
|
const char *comment_prefix=
|
||||||
|
(opt_master_data == MYSQL_OPT_MASTER_DATA_COMMENTED_SQL) ? "-- " : "";
|
||||||
|
if (mysql_query_with_error_report(mysql_con, &master, "SHOW MASTER STATUS"))
|
||||||
|
{
|
||||||
|
my_printf_error(0, "Error: Couldn't execute 'SHOW MASTER STATUS': %s",
|
||||||
|
MYF(0), mysql_error(mysql_con));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
row = mysql_fetch_row(master);
|
||||||
|
if (row && row[0] && row[1])
|
||||||
|
{
|
||||||
|
if (opt_comments)
|
||||||
|
fprintf(md_result_file,
|
||||||
|
"\n--\n-- Position to start replication or point-in-time "
|
||||||
|
"recovery from\n--\n\n");
|
||||||
|
fprintf(md_result_file,
|
||||||
|
"%sCHANGE MASTER TO MASTER_LOG_FILE='%s', MASTER_LOG_POS=%s;\n",
|
||||||
|
comment_prefix, row[0], row[1]);
|
||||||
|
check_io(md_result_file);
|
||||||
|
}
|
||||||
|
mysql_free_result(master);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int do_flush_tables_read_lock(MYSQL *mysql_con)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
mysql_query_with_error_report(mysql_con, 0, "FLUSH TABLES WITH READ LOCK");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int do_unlock_tables(MYSQL *mysql_con)
|
||||||
|
{
|
||||||
|
return mysql_query_with_error_report(mysql_con, 0, "UNLOCK TABLES");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int do_reset_master(MYSQL *mysql_con)
|
||||||
|
{
|
||||||
|
return mysql_query_with_error_report(mysql_con, 0, "RESET MASTER");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int start_transaction(MYSQL *mysql_con, my_bool consistent_read_now)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
We use BEGIN for old servers. --single-transaction --master-data will fail
|
||||||
|
on old servers, but that's ok as it was already silently broken (it didn't
|
||||||
|
do a consistent read, so better tell people frankly, with the error).
|
||||||
|
*/
|
||||||
|
return (mysql_query_with_error_report(mysql_con, 0,
|
||||||
|
consistent_read_now ?
|
||||||
|
"START TRANSACTION "
|
||||||
|
"WITH CONSISTENT SNAPSHOT" :
|
||||||
|
"BEGIN"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static ulong find_set(TYPELIB *lib, const char *x, uint length,
|
static ulong find_set(TYPELIB *lib, const char *x, uint length,
|
||||||
char **err_pos, uint *err_len)
|
char **err_pos, uint *err_len)
|
||||||
|
@ -2068,7 +2177,7 @@ static const char *check_if_ignore_table(const char *table_name)
|
||||||
|
|
||||||
sprintf(buff,"show table status like %s",
|
sprintf(buff,"show table status like %s",
|
||||||
quote_for_like(table_name, show_name_buff));
|
quote_for_like(table_name, show_name_buff));
|
||||||
if (mysql_query(sock, buff))
|
if (mysql_query_with_error_report(sock, &res, buff))
|
||||||
{
|
{
|
||||||
if (mysql_errno(sock) != ER_PARSE_ERROR)
|
if (mysql_errno(sock) != ER_PARSE_ERROR)
|
||||||
{ /* If old MySQL version */
|
{ /* If old MySQL version */
|
||||||
|
@ -2079,8 +2188,7 @@ static const char *check_if_ignore_table(const char *table_name)
|
||||||
return 0; /* assume table is ok */
|
return 0; /* assume table is ok */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!(res= mysql_store_result(sock)) ||
|
if (!(row= mysql_fetch_row(res)))
|
||||||
!(row= mysql_fetch_row(res)))
|
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Error: Couldn't read status information for table %s (%s)\n",
|
"Error: Couldn't read status information for table %s (%s)\n",
|
||||||
|
@ -2099,8 +2207,6 @@ static const char *check_if_ignore_table(const char *table_name)
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
MYSQL_ROW row;
|
|
||||||
MYSQL_RES *master;
|
|
||||||
compatible_mode_normal_str[0]= 0;
|
compatible_mode_normal_str[0]= 0;
|
||||||
|
|
||||||
MY_INIT(argv[0]);
|
MY_INIT(argv[0]);
|
||||||
|
@ -2114,28 +2220,24 @@ int main(int argc, char **argv)
|
||||||
if (!path)
|
if (!path)
|
||||||
write_header(md_result_file, *argv);
|
write_header(md_result_file, *argv);
|
||||||
|
|
||||||
if (opt_first_slave)
|
if ((opt_lock_all_tables || opt_master_data) &&
|
||||||
|
do_flush_tables_read_lock(sock))
|
||||||
|
goto err;
|
||||||
|
if (opt_single_transaction && start_transaction(sock, test(opt_master_data)))
|
||||||
|
goto err;
|
||||||
|
if (opt_delete_master_logs && do_reset_master(sock))
|
||||||
|
goto err;
|
||||||
|
if (opt_lock_all_tables || opt_master_data)
|
||||||
{
|
{
|
||||||
lock_tables=0; /* No other locks needed */
|
if (flush_logs && mysql_refresh(sock, REFRESH_LOG))
|
||||||
if (mysql_query(sock, "FLUSH TABLES WITH READ LOCK"))
|
goto err;
|
||||||
{
|
flush_logs= 0; /* not anymore; that would not be sensible */
|
||||||
my_printf_error(0, "Error: Couldn't execute 'FLUSH TABLES WITH READ LOCK': %s",
|
|
||||||
MYF(0), mysql_error(sock));
|
|
||||||
my_end(0);
|
|
||||||
return(first_error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (opt_single_transaction)
|
|
||||||
{
|
|
||||||
/* There is no sense to start transaction if all tables are locked */
|
|
||||||
if (mysql_query(sock, "BEGIN"))
|
|
||||||
{
|
|
||||||
my_printf_error(0, "Error: Couldn't execute 'BEGIN': %s",
|
|
||||||
MYF(0), mysql_error(sock));
|
|
||||||
my_end(0);
|
|
||||||
return(first_error);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (opt_master_data && do_show_master_status(sock))
|
||||||
|
goto err;
|
||||||
|
if (opt_single_transaction && do_unlock_tables(sock)) // unlock but no commit!
|
||||||
|
goto err;
|
||||||
|
|
||||||
if (opt_alldbs)
|
if (opt_alldbs)
|
||||||
dump_all_databases();
|
dump_all_databases();
|
||||||
else if (argc > 1 && !opt_databases)
|
else if (argc > 1 && !opt_databases)
|
||||||
|
@ -2148,57 +2250,16 @@ int main(int argc, char **argv)
|
||||||
/* One or more databases, all tables */
|
/* One or more databases, all tables */
|
||||||
dump_databases(argv);
|
dump_databases(argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opt_first_slave)
|
|
||||||
{
|
|
||||||
if (opt_delete_master_logs && mysql_query(sock, "FLUSH MASTER"))
|
|
||||||
{
|
|
||||||
my_printf_error(0, "Error: Couldn't execute 'FLUSH MASTER': %s",
|
|
||||||
MYF(0), mysql_error(sock));
|
|
||||||
}
|
|
||||||
if (opt_master_data)
|
|
||||||
{
|
|
||||||
if (mysql_query(sock, "SHOW MASTER STATUS") ||
|
|
||||||
!(master = mysql_store_result(sock)))
|
|
||||||
my_printf_error(0, "Error: Couldn't execute 'SHOW MASTER STATUS': %s",
|
|
||||||
MYF(0), mysql_error(sock));
|
|
||||||
else
|
|
||||||
{
|
|
||||||
row = mysql_fetch_row(master);
|
|
||||||
if (row && row[0] && row[1])
|
|
||||||
{
|
|
||||||
if (opt_comments)
|
|
||||||
fprintf(md_result_file,
|
|
||||||
"\n--\n-- Position to start replication from\n--\n\n");
|
|
||||||
fprintf(md_result_file,
|
|
||||||
"CHANGE MASTER TO MASTER_LOG_FILE='%s', \
|
|
||||||
MASTER_LOG_POS=%s ;\n",row[0],row[1]);
|
|
||||||
check_io(md_result_file);
|
|
||||||
}
|
|
||||||
mysql_free_result(master);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (mysql_query(sock, "UNLOCK TABLES"))
|
|
||||||
my_printf_error(0, "Error: Couldn't execute 'UNLOCK TABLES': %s",
|
|
||||||
MYF(0), mysql_error(sock));
|
|
||||||
}
|
|
||||||
else if (opt_single_transaction) /* Just to make it beautiful enough */
|
|
||||||
#ifdef HAVE_SMEM
|
#ifdef HAVE_SMEM
|
||||||
my_free(shared_memory_base_name,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(shared_memory_base_name,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
#endif
|
#endif
|
||||||
{
|
|
||||||
/*
|
/*
|
||||||
In case we were locking all tables, we did not start transaction
|
No reason to explicitely COMMIT the transaction, neither to explicitely
|
||||||
so there is no need to commit it.
|
UNLOCK TABLES: these will be automatically be done by the server when we
|
||||||
|
disconnect now. Saves some code here, some network trips, adds nothing to
|
||||||
|
server.
|
||||||
*/
|
*/
|
||||||
|
err:
|
||||||
/* This should just free locks as we did not change anything */
|
|
||||||
if (mysql_query(sock, "COMMIT"))
|
|
||||||
{
|
|
||||||
my_printf_error(0, "Error: Couldn't execute 'COMMIT': %s",
|
|
||||||
MYF(0), mysql_error(sock));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dbDisconnect(current_host);
|
dbDisconnect(current_host);
|
||||||
if (!path)
|
if (!path)
|
||||||
write_footer(md_result_file);
|
write_footer(md_result_file);
|
||||||
|
|
|
@ -319,4 +319,5 @@
|
||||||
#define ER_INVALID_CHARACTER_STRING 1300
|
#define ER_INVALID_CHARACTER_STRING 1300
|
||||||
#define ER_WARN_ALLOWED_PACKET_OVERFLOWED 1301
|
#define ER_WARN_ALLOWED_PACKET_OVERFLOWED 1301
|
||||||
#define ER_CONFLICTING_DECLARATIONS 1302
|
#define ER_CONFLICTING_DECLARATIONS 1302
|
||||||
#define ER_ERROR_MESSAGES 303
|
#define ER_NO_CONS_READ_ENGINE 1303
|
||||||
|
#define ER_ERROR_MESSAGES 304
|
||||||
|
|
15
mysql-test/r/consistent_snapshot.result
Normal file
15
mysql-test/r/consistent_snapshot.result
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
drop table if exists t1;
|
||||||
|
create table t1 (a int) engine=innodb;
|
||||||
|
start transaction with consistent snapshot;
|
||||||
|
insert into t1 values(1);
|
||||||
|
select * from t1;
|
||||||
|
a
|
||||||
|
commit;
|
||||||
|
delete from t1;
|
||||||
|
start transaction;
|
||||||
|
insert into t1 values(1);
|
||||||
|
select * from t1;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
commit;
|
||||||
|
drop table t1;
|
22
mysql-test/r/rpl_rewrite_db.result
Normal file
22
mysql-test/r/rpl_rewrite_db.result
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
stop slave;
|
||||||
|
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;
|
||||||
|
start slave;
|
||||||
|
drop database if exists mysqltest1;
|
||||||
|
create database mysqltest1;
|
||||||
|
use mysqltest1;
|
||||||
|
create table t1 (a int);
|
||||||
|
insert into t1 values(9);
|
||||||
|
select * from mysqltest1.t1;
|
||||||
|
a
|
||||||
|
9
|
||||||
|
show databases like 'mysqltest1';
|
||||||
|
Database (mysqltest1)
|
||||||
|
mysqltest1
|
||||||
|
select * from test.t1;
|
||||||
|
a
|
||||||
|
9
|
||||||
|
drop table t1;
|
||||||
|
drop database mysqltest1;
|
41
mysql-test/t/consistent_snapshot.test
Normal file
41
mysql-test/t/consistent_snapshot.test
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
-- source include/have_innodb.inc
|
||||||
|
|
||||||
|
--disable_warnings
|
||||||
|
drop table if exists t1;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
connect (con1,localhost,root,,);
|
||||||
|
connect (con2,localhost,root,,);
|
||||||
|
|
||||||
|
### Test 1:
|
||||||
|
### - While a consistent snapshot transaction is executed,
|
||||||
|
### no external inserts should be visible to the transaction.
|
||||||
|
|
||||||
|
connection con1;
|
||||||
|
create table t1 (a int) engine=innodb;
|
||||||
|
start transaction with consistent snapshot;
|
||||||
|
|
||||||
|
connection con2;
|
||||||
|
insert into t1 values(1);
|
||||||
|
|
||||||
|
connection con1;
|
||||||
|
select * from t1; # if consistent snapshot was set as expected, we
|
||||||
|
# should see nothing.
|
||||||
|
commit;
|
||||||
|
|
||||||
|
### Test 2:
|
||||||
|
### - For any non-consistent snapshot transaction, external
|
||||||
|
### committed inserts should be visible to the transaction.
|
||||||
|
|
||||||
|
delete from t1;
|
||||||
|
start transaction; # Now we omit WITH CONSISTENT SNAPSHOT
|
||||||
|
|
||||||
|
connection con2;
|
||||||
|
insert into t1 values(1);
|
||||||
|
|
||||||
|
connection con1;
|
||||||
|
select * from t1; # if consistent snapshot was not set, as expected, we
|
||||||
|
# should see 1.
|
||||||
|
commit;
|
||||||
|
|
||||||
|
drop table t1;
|
1
mysql-test/t/rpl_rewrite_db-slave.opt
Normal file
1
mysql-test/t/rpl_rewrite_db-slave.opt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
"--replicate-rewrite-db=mysqltest1->test"
|
19
mysql-test/t/rpl_rewrite_db.test
Normal file
19
mysql-test/t/rpl_rewrite_db.test
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
source include/master-slave.inc;
|
||||||
|
--disable_warnings
|
||||||
|
drop database if exists mysqltest1;
|
||||||
|
--enable_warnings
|
||||||
|
create database mysqltest1;
|
||||||
|
|
||||||
|
use mysqltest1;
|
||||||
|
create table t1 (a int);
|
||||||
|
insert into t1 values(9);
|
||||||
|
select * from mysqltest1.t1;
|
||||||
|
sync_slave_with_master;
|
||||||
|
show databases like 'mysqltest1'; # should be empty
|
||||||
|
select * from test.t1;
|
||||||
|
# cleanup
|
||||||
|
connection master;
|
||||||
|
drop table t1;
|
||||||
|
drop database mysqltest1;
|
||||||
|
sync_slave_with_master;
|
||||||
|
|
|
@ -583,6 +583,12 @@ int ha_rollback_trans(THD *thd, THD_TRANS *trans)
|
||||||
if (opt_using_transactions)
|
if (opt_using_transactions)
|
||||||
{
|
{
|
||||||
bool operation_done=0;
|
bool operation_done=0;
|
||||||
|
/*
|
||||||
|
As rollback can be 30 times slower than insert in InnoDB, and user may
|
||||||
|
not know there's rollback (if it's because of a dupl row), better warn.
|
||||||
|
*/
|
||||||
|
const char *save_proc_info= thd->proc_info;
|
||||||
|
thd->proc_info= "Rolling back";
|
||||||
#ifdef HAVE_NDBCLUSTER_DB
|
#ifdef HAVE_NDBCLUSTER_DB
|
||||||
if (trans->ndb_tid)
|
if (trans->ndb_tid)
|
||||||
{
|
{
|
||||||
|
@ -654,6 +660,7 @@ int ha_rollback_trans(THD *thd, THD_TRANS *trans)
|
||||||
thd->variables.tx_isolation=thd->session_tx_isolation;
|
thd->variables.tx_isolation=thd->session_tx_isolation;
|
||||||
if (operation_done)
|
if (operation_done)
|
||||||
statistic_increment(ha_rollback_count,&LOCK_status);
|
statistic_increment(ha_rollback_count,&LOCK_status);
|
||||||
|
thd->proc_info= save_proc_info;
|
||||||
}
|
}
|
||||||
#endif /* USING_TRANSACTIONS */
|
#endif /* USING_TRANSACTIONS */
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
|
@ -766,6 +773,24 @@ int ha_savepoint(THD *thd, char *savepoint_name)
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int ha_start_consistent_snapshot(THD *thd)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_INNOBASE_DB
|
||||||
|
if ((have_innodb == SHOW_OPTION_YES) &&
|
||||||
|
!innobase_start_trx_and_assign_read_view(thd))
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
Same idea as when one wants to CREATE TABLE in one engine which does not
|
||||||
|
exist:
|
||||||
|
*/
|
||||||
|
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||||
|
ER_NO_CONS_READ_ENGINE, ER(ER_NO_CONS_READ_ENGINE));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool ha_flush_logs()
|
bool ha_flush_logs()
|
||||||
{
|
{
|
||||||
bool result=0;
|
bool result=0;
|
||||||
|
|
|
@ -138,6 +138,8 @@
|
||||||
#define HA_CACHE_TBL_ASKTRANSACT 2
|
#define HA_CACHE_TBL_ASKTRANSACT 2
|
||||||
#define HA_CACHE_TBL_TRANSACT 4
|
#define HA_CACHE_TBL_TRANSACT 4
|
||||||
|
|
||||||
|
/* Options of START TRANSACTION statement (and later of SET TRANSACTION stmt) */
|
||||||
|
#define MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT 1
|
||||||
|
|
||||||
enum db_type
|
enum db_type
|
||||||
{
|
{
|
||||||
|
@ -568,4 +570,4 @@ int ha_find_files(THD *thd,const char *db,const char *path,
|
||||||
const char *wild, bool dir,List<char>* files);
|
const char *wild, bool dir,List<char>* files);
|
||||||
int ha_table_exists(THD* thd, const char* db, const char* name);
|
int ha_table_exists(THD* thd, const char* db, const char* name);
|
||||||
TYPELIB *ha_known_exts(void);
|
TYPELIB *ha_known_exts(void);
|
||||||
|
int ha_start_consistent_snapshot(THD *thd);
|
||||||
|
|
|
@ -114,6 +114,7 @@ static SYMBOL symbols[] = {
|
||||||
{ "COMMITTED", SYM(COMMITTED_SYM)},
|
{ "COMMITTED", SYM(COMMITTED_SYM)},
|
||||||
{ "COMPRESSED", SYM(COMPRESSED_SYM)},
|
{ "COMPRESSED", SYM(COMPRESSED_SYM)},
|
||||||
{ "CONCURRENT", SYM(CONCURRENT)},
|
{ "CONCURRENT", SYM(CONCURRENT)},
|
||||||
|
{ "CONSISTENT", SYM(CONSISTENT_SYM)},
|
||||||
{ "CONSTRAINT", SYM(CONSTRAINT)},
|
{ "CONSTRAINT", SYM(CONSTRAINT)},
|
||||||
{ "CONVERT", SYM(CONVERT_SYM)},
|
{ "CONVERT", SYM(CONVERT_SYM)},
|
||||||
{ "CREATE", SYM(CREATE)},
|
{ "CREATE", SYM(CREATE)},
|
||||||
|
@ -382,6 +383,7 @@ static SYMBOL symbols[] = {
|
||||||
{ "SIGNED", SYM(SIGNED_SYM)},
|
{ "SIGNED", SYM(SIGNED_SYM)},
|
||||||
{ "SIMPLE", SYM(SIMPLE_SYM)},
|
{ "SIMPLE", SYM(SIMPLE_SYM)},
|
||||||
{ "SLAVE", SYM(SLAVE)},
|
{ "SLAVE", SYM(SLAVE)},
|
||||||
|
{ "SNAPSHOT", SYM(SNAPSHOT_SYM)},
|
||||||
{ "SMALLINT", SYM(SMALLINT)},
|
{ "SMALLINT", SYM(SMALLINT)},
|
||||||
{ "SOME", SYM(ANY_SYM)},
|
{ "SOME", SYM(ANY_SYM)},
|
||||||
{ "SONAME", SYM(UDF_SONAME_SYM)},
|
{ "SONAME", SYM(UDF_SONAME_SYM)},
|
||||||
|
|
|
@ -977,7 +977,8 @@ void Query_log_event::print(FILE* file, bool short_form, char* last_db)
|
||||||
int Query_log_event::exec_event(struct st_relay_log_info* rli)
|
int Query_log_event::exec_event(struct st_relay_log_info* rli)
|
||||||
{
|
{
|
||||||
int expected_error,actual_error= 0;
|
int expected_error,actual_error= 0;
|
||||||
thd->db= (char*) rewrite_db(db); // thd->db_length is set later if needed
|
thd->db_length= db_len;
|
||||||
|
thd->db= (char*) rewrite_db(db, &thd->db_length);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
InnoDB internally stores the master log position it has processed so far;
|
InnoDB internally stores the master log position it has processed so far;
|
||||||
|
@ -995,11 +996,6 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli)
|
||||||
if (db_ok(thd->db, replicate_do_db, replicate_ignore_db))
|
if (db_ok(thd->db, replicate_do_db, replicate_ignore_db))
|
||||||
{
|
{
|
||||||
thd->set_time((time_t)when);
|
thd->set_time((time_t)when);
|
||||||
/*
|
|
||||||
We cannot use db_len from event to fill thd->db_length, because
|
|
||||||
rewrite_db() may have changed db.
|
|
||||||
*/
|
|
||||||
thd->db_length= thd->db ? strlen(thd->db) : 0;
|
|
||||||
thd->query_length= q_len;
|
thd->query_length= q_len;
|
||||||
thd->query = (char*)query;
|
thd->query = (char*)query;
|
||||||
VOID(pthread_mutex_lock(&LOCK_thread_count));
|
VOID(pthread_mutex_lock(&LOCK_thread_count));
|
||||||
|
@ -1057,7 +1053,7 @@ Default database: '%s'. Query: '%s'",
|
||||||
expected_error,
|
expected_error,
|
||||||
actual_error ? thd->net.last_error: "no error",
|
actual_error ? thd->net.last_error: "no error",
|
||||||
actual_error,
|
actual_error,
|
||||||
print_slave_db_safe(db), query);
|
print_slave_db_safe(thd->db), query);
|
||||||
thd->query_error= 1;
|
thd->query_error= 1;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
@ -1078,7 +1074,7 @@ Default database: '%s'. Query: '%s'",
|
||||||
"Error '%s' on query. Default database: '%s'. Query: '%s'",
|
"Error '%s' on query. Default database: '%s'. Query: '%s'",
|
||||||
(actual_error ? thd->net.last_error :
|
(actual_error ? thd->net.last_error :
|
||||||
"unexpected success or fatal error"),
|
"unexpected success or fatal error"),
|
||||||
print_slave_db_safe(db), query);
|
print_slave_db_safe(thd->db), query);
|
||||||
thd->query_error= 1;
|
thd->query_error= 1;
|
||||||
}
|
}
|
||||||
} /* End of if (db_ok(... */
|
} /* End of if (db_ok(... */
|
||||||
|
@ -1706,7 +1702,8 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
|
||||||
bool use_rli_only_for_errors)
|
bool use_rli_only_for_errors)
|
||||||
{
|
{
|
||||||
char *load_data_query= 0;
|
char *load_data_query= 0;
|
||||||
thd->db= (char*) rewrite_db(db); // thd->db_length is set later if needed
|
thd->db_length= db_len;
|
||||||
|
thd->db= (char*) rewrite_db(db, &thd->db_length);
|
||||||
DBUG_ASSERT(thd->query == 0);
|
DBUG_ASSERT(thd->query == 0);
|
||||||
thd->query_length= 0; // Should not be needed
|
thd->query_length= 0; // Should not be needed
|
||||||
thd->query_error= 0;
|
thd->query_error= 0;
|
||||||
|
@ -1741,7 +1738,6 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
|
||||||
if (db_ok(thd->db, replicate_do_db, replicate_ignore_db))
|
if (db_ok(thd->db, replicate_do_db, replicate_ignore_db))
|
||||||
{
|
{
|
||||||
thd->set_time((time_t)when);
|
thd->set_time((time_t)when);
|
||||||
thd->db_length= thd->db ? strlen(thd->db) : 0;
|
|
||||||
VOID(pthread_mutex_lock(&LOCK_thread_count));
|
VOID(pthread_mutex_lock(&LOCK_thread_count));
|
||||||
thd->query_id = query_id++;
|
thd->query_id = query_id++;
|
||||||
VOID(pthread_mutex_unlock(&LOCK_thread_count));
|
VOID(pthread_mutex_unlock(&LOCK_thread_count));
|
||||||
|
@ -1847,7 +1843,7 @@ Slave: load data infile on table '%s' at log position %s in log \
|
||||||
(char*) table_name,
|
(char*) table_name,
|
||||||
llstr(log_pos,llbuff), RPL_LOG_NAME,
|
llstr(log_pos,llbuff), RPL_LOG_NAME,
|
||||||
(ulong) thd->cuted_fields,
|
(ulong) thd->cuted_fields,
|
||||||
print_slave_db_safe(db));
|
print_slave_db_safe(thd->db));
|
||||||
}
|
}
|
||||||
if (net)
|
if (net)
|
||||||
net->pkt_nr= thd->net.pkt_nr;
|
net->pkt_nr= thd->net.pkt_nr;
|
||||||
|
@ -1865,6 +1861,7 @@ Slave: load data infile on table '%s' at log position %s in log \
|
||||||
}
|
}
|
||||||
|
|
||||||
thd->net.vio = 0;
|
thd->net.vio = 0;
|
||||||
|
char *save_db= thd->db;
|
||||||
VOID(pthread_mutex_lock(&LOCK_thread_count));
|
VOID(pthread_mutex_lock(&LOCK_thread_count));
|
||||||
thd->db= 0;
|
thd->db= 0;
|
||||||
thd->query= 0;
|
thd->query= 0;
|
||||||
|
@ -1887,7 +1884,7 @@ Slave: load data infile on table '%s' at log position %s in log \
|
||||||
}
|
}
|
||||||
slave_print_error(rli,sql_errno,"\
|
slave_print_error(rli,sql_errno,"\
|
||||||
Error '%s' running LOAD DATA INFILE on table '%s'. Default database: '%s'",
|
Error '%s' running LOAD DATA INFILE on table '%s'. Default database: '%s'",
|
||||||
err, (char*)table_name, print_slave_db_safe(db));
|
err, (char*)table_name, print_slave_db_safe(save_db));
|
||||||
free_root(thd->mem_root,MYF(MY_KEEP_PREALLOC));
|
free_root(thd->mem_root,MYF(MY_KEEP_PREALLOC));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -1897,7 +1894,7 @@ Error '%s' running LOAD DATA INFILE on table '%s'. Default database: '%s'",
|
||||||
{
|
{
|
||||||
slave_print_error(rli,ER_UNKNOWN_ERROR, "\
|
slave_print_error(rli,ER_UNKNOWN_ERROR, "\
|
||||||
Fatal error running LOAD DATA INFILE on table '%s'. Default database: '%s'",
|
Fatal error running LOAD DATA INFILE on table '%s'. Default database: '%s'",
|
||||||
(char*)table_name, print_slave_db_safe(db));
|
(char*)table_name, print_slave_db_safe(save_db));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -331,3 +331,4 @@ character-set=latin2
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -322,3 +322,4 @@ character-set=latin1
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -331,3 +331,4 @@ character-set=latin1
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -319,3 +319,4 @@ character-set=latin1
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -324,3 +324,4 @@ character-set=latin7
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -319,3 +319,4 @@ character-set=latin1
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -332,3 +332,4 @@ character-set=latin1
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -319,3 +319,4 @@ character-set=greek
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -324,3 +324,4 @@ character-set=latin2
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -319,3 +319,4 @@ character-set=latin1
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -323,3 +323,4 @@ character-set=ujis
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -319,3 +319,4 @@ character-set=euckr
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -321,3 +321,4 @@ character-set=latin1
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -321,3 +321,4 @@ character-set=latin1
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -324,3 +324,4 @@ character-set=latin2
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -321,3 +321,4 @@ character-set=latin1
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -324,3 +324,4 @@ character-set=latin2
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -324,3 +324,4 @@ character-set=koi8r
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -312,3 +312,4 @@ character-set=cp1250
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -327,3 +327,4 @@ character-set=latin2
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -323,3 +323,4 @@ character-set=latin1
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -319,3 +319,4 @@ character-set=latin1
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -325,3 +325,4 @@ character-set=koi8u
|
||||||
"Invalid %s character string: '%.64s'",
|
"Invalid %s character string: '%.64s'",
|
||||||
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
"Result of %s() was larger than max_allowed_packet (%ld) - truncated"
|
||||||
"Conflicting declarations: '%s%s' and '%s%s'"
|
"Conflicting declarations: '%s%s' and '%s%s'"
|
||||||
|
"This MySQL server does not support any consistent-read capable storage engine"
|
||||||
|
|
|
@ -1032,7 +1032,7 @@ bool net_request_file(NET* net, const char* fname)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const char *rewrite_db(const char* db)
|
const char *rewrite_db(const char* db, uint *new_len)
|
||||||
{
|
{
|
||||||
if (replicate_rewrite_db.is_empty() || !db)
|
if (replicate_rewrite_db.is_empty() || !db)
|
||||||
return db;
|
return db;
|
||||||
|
@ -1042,8 +1042,11 @@ const char *rewrite_db(const char* db)
|
||||||
while ((tmp=it++))
|
while ((tmp=it++))
|
||||||
{
|
{
|
||||||
if (!strcmp(tmp->key, db))
|
if (!strcmp(tmp->key, db))
|
||||||
|
{
|
||||||
|
*new_len= strlen(tmp->val);
|
||||||
return tmp->val;
|
return tmp->val;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return db;
|
return db;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1056,7 +1059,7 @@ const char *rewrite_db(const char* db)
|
||||||
|
|
||||||
const char *print_slave_db_safe(const char* db)
|
const char *print_slave_db_safe(const char* db)
|
||||||
{
|
{
|
||||||
return (db ? rewrite_db(db) : "");
|
return (db ? db : "");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -510,8 +510,8 @@ int add_table_rule(HASH* h, const char* table_spec);
|
||||||
int add_wild_table_rule(DYNAMIC_ARRAY* a, const char* table_spec);
|
int add_wild_table_rule(DYNAMIC_ARRAY* a, const char* table_spec);
|
||||||
void init_table_rule_hash(HASH* h, bool* h_inited);
|
void init_table_rule_hash(HASH* h, bool* h_inited);
|
||||||
void init_table_rule_array(DYNAMIC_ARRAY* a, bool* a_inited);
|
void init_table_rule_array(DYNAMIC_ARRAY* a, bool* a_inited);
|
||||||
const char *rewrite_db(const char* db);
|
const char *rewrite_db(const char* db, uint *new_db_len);
|
||||||
const char *print_slave_db_safe(const char* db);
|
const char *print_slave_db_safe(const char *db);
|
||||||
int check_expected_error(THD* thd, RELAY_LOG_INFO* rli, int error_code);
|
int check_expected_error(THD* thd, RELAY_LOG_INFO* rli, int error_code);
|
||||||
void skip_load_data_infile(NET* net);
|
void skip_load_data_infile(NET* net);
|
||||||
void slave_print_error(RELAY_LOG_INFO* rli, int err_code, const char* msg, ...);
|
void slave_print_error(RELAY_LOG_INFO* rli, int err_code, const char* msg, ...);
|
||||||
|
|
|
@ -613,7 +613,7 @@ typedef struct st_lex
|
||||||
uint uint_geom_type;
|
uint uint_geom_type;
|
||||||
uint grant, grant_tot_col, which_columns;
|
uint grant, grant_tot_col, which_columns;
|
||||||
uint fk_delete_opt, fk_update_opt, fk_match_option;
|
uint fk_delete_opt, fk_update_opt, fk_match_option;
|
||||||
uint slave_thd_opt;
|
uint slave_thd_opt, start_transaction_opt;
|
||||||
uint8 describe;
|
uint8 describe;
|
||||||
bool drop_if_exists, drop_temporary, local_file, one_shot_set;
|
bool drop_if_exists, drop_temporary, local_file, one_shot_set;
|
||||||
bool in_comment, ignore_space, verbose, no_write_to_binlog;
|
bool in_comment, ignore_space, verbose, no_write_to_binlog;
|
||||||
|
|
|
@ -3076,6 +3076,12 @@ purposes internal to the MySQL server", MYF(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
case SQLCOM_UNLOCK_TABLES:
|
case SQLCOM_UNLOCK_TABLES:
|
||||||
|
/*
|
||||||
|
It is critical for mysqldump --single-transaction --master-data that
|
||||||
|
UNLOCK TABLES does not implicitely commit a connection which has only
|
||||||
|
done FLUSH TABLES WITH READ LOCK + BEGIN. If this assumption becomes
|
||||||
|
false, mysqldump will not work.
|
||||||
|
*/
|
||||||
unlock_locked_tables(thd);
|
unlock_locked_tables(thd);
|
||||||
if (thd->options & OPTION_TABLE_LOCK)
|
if (thd->options & OPTION_TABLE_LOCK)
|
||||||
{
|
{
|
||||||
|
@ -3462,6 +3468,8 @@ purposes internal to the MySQL server", MYF(0));
|
||||||
thd->options= ((thd->options & (ulong) ~(OPTION_STATUS_NO_TRANS_UPDATE)) |
|
thd->options= ((thd->options & (ulong) ~(OPTION_STATUS_NO_TRANS_UPDATE)) |
|
||||||
OPTION_BEGIN);
|
OPTION_BEGIN);
|
||||||
thd->server_status|= SERVER_STATUS_IN_TRANS;
|
thd->server_status|= SERVER_STATUS_IN_TRANS;
|
||||||
|
if (!(lex->start_transaction_opt & MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT) ||
|
||||||
|
!(res= ha_start_consistent_snapshot(thd)))
|
||||||
send_ok(thd);
|
send_ok(thd);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -131,6 +131,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
|
||||||
%token CLIENT_SYM
|
%token CLIENT_SYM
|
||||||
%token COMMENT_SYM
|
%token COMMENT_SYM
|
||||||
%token COMMIT_SYM
|
%token COMMIT_SYM
|
||||||
|
%token CONSISTENT_SYM
|
||||||
%token COUNT_SYM
|
%token COUNT_SYM
|
||||||
%token CREATE
|
%token CREATE
|
||||||
%token CROSS
|
%token CROSS
|
||||||
|
@ -165,6 +166,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
|
||||||
%token SELECT_SYM
|
%token SELECT_SYM
|
||||||
%token SHOW
|
%token SHOW
|
||||||
%token SLAVE
|
%token SLAVE
|
||||||
|
%token SNAPSHOT_SYM
|
||||||
%token SQL_THREAD
|
%token SQL_THREAD
|
||||||
%token START_SYM
|
%token START_SYM
|
||||||
%token STD_SYM
|
%token STD_SYM
|
||||||
|
@ -618,6 +620,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
|
||||||
table_option opt_if_not_exists opt_no_write_to_binlog opt_var_type
|
table_option opt_if_not_exists opt_no_write_to_binlog opt_var_type
|
||||||
opt_var_ident_type delete_option opt_temporary all_or_any opt_distinct
|
opt_var_ident_type delete_option opt_temporary all_or_any opt_distinct
|
||||||
opt_ignore_leaves fulltext_options spatial_type union_option
|
opt_ignore_leaves fulltext_options spatial_type union_option
|
||||||
|
start_transaction_opts
|
||||||
|
|
||||||
%type <ulong_num>
|
%type <ulong_num>
|
||||||
ULONG_NUM raid_types merge_insert_types
|
ULONG_NUM raid_types merge_insert_types
|
||||||
|
@ -2095,10 +2098,20 @@ slave:
|
||||||
|
|
||||||
|
|
||||||
start:
|
start:
|
||||||
START_SYM TRANSACTION_SYM { Lex->sql_command = SQLCOM_BEGIN;}
|
START_SYM TRANSACTION_SYM start_transaction_opts
|
||||||
{}
|
{
|
||||||
|
Lex->sql_command = SQLCOM_BEGIN;
|
||||||
|
Lex->start_transaction_opt= $3;
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
start_transaction_opts:
|
||||||
|
/*empty*/ { $$ = 0; }
|
||||||
|
| WITH CONSISTENT_SYM SNAPSHOT_SYM
|
||||||
|
{
|
||||||
|
$$= MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT;
|
||||||
|
}
|
||||||
|
|
||||||
slave_thread_opts:
|
slave_thread_opts:
|
||||||
{ Lex->slave_thd_opt= 0; }
|
{ Lex->slave_thd_opt= 0; }
|
||||||
slave_thread_opt_list
|
slave_thread_opt_list
|
||||||
|
@ -5122,6 +5135,7 @@ keyword:
|
||||||
| COMMIT_SYM {}
|
| COMMIT_SYM {}
|
||||||
| COMPRESSED_SYM {}
|
| COMPRESSED_SYM {}
|
||||||
| CONCURRENT {}
|
| CONCURRENT {}
|
||||||
|
| CONSISTENT_SYM {}
|
||||||
| CUBE_SYM {}
|
| CUBE_SYM {}
|
||||||
| DATA_SYM {}
|
| DATA_SYM {}
|
||||||
| DATETIME {}
|
| DATETIME {}
|
||||||
|
@ -5262,6 +5276,7 @@ keyword:
|
||||||
| SHARE_SYM {}
|
| SHARE_SYM {}
|
||||||
| SHUTDOWN {}
|
| SHUTDOWN {}
|
||||||
| SLAVE {}
|
| SLAVE {}
|
||||||
|
| SNAPSHOT_SYM {}
|
||||||
| SOUNDS_SYM {}
|
| SOUNDS_SYM {}
|
||||||
| SQL_CACHE_SYM {}
|
| SQL_CACHE_SYM {}
|
||||||
| SQL_BUFFER_RESULT {}
|
| SQL_BUFFER_RESULT {}
|
||||||
|
@ -5888,7 +5903,7 @@ grant_option:
|
||||||
;
|
;
|
||||||
|
|
||||||
begin:
|
begin:
|
||||||
BEGIN_SYM { Lex->sql_command = SQLCOM_BEGIN;} opt_work {}
|
BEGIN_SYM { Lex->sql_command = SQLCOM_BEGIN; Lex->start_transaction_opt= 0;} opt_work {}
|
||||||
;
|
;
|
||||||
|
|
||||||
opt_work:
|
opt_work:
|
||||||
|
|
Loading…
Add table
Reference in a new issue