Loading client/mysqldump.c +98 −58 Original line number Diff line number Diff line Loading @@ -57,6 +57,7 @@ #define EX_CONSCHECK 3 #define EX_EOM 4 #define EX_EOF 5 /* ferror for output file was got */ #define EX_ILLEGAL_TABLE 6 /* index into 'show fields from table' */ Loading Loading @@ -140,14 +141,6 @@ const char *compatible_mode_names[]= TYPELIB compatible_mode_typelib= {array_elements(compatible_mode_names) - 1, "", compatible_mode_names, NULL}; #define TABLE_RULE_HASH_SIZE 16 typedef struct st_table_rule_ent { char* key; /* dbname.tablename */ uint key_len; } TABLE_RULE_ENT; HASH ignore_table; static struct my_option my_long_options[] = Loading Loading @@ -538,29 +531,21 @@ static void write_footer(FILE *sql_file) } /* write_footer */ static void free_table_ent(TABLE_RULE_ENT* e) { my_free((gptr) e, MYF(0)); } static byte* get_table_key(TABLE_RULE_ENT* e, uint* len, byte* get_table_key(const char *entry, uint *length, my_bool not_used __attribute__((unused))) { *len= e->key_len; return (byte*)e->key; *length= strlen(entry); return (byte*) entry; } void init_table_rule_hash(HASH* h) { if(hash_init(h, charset_info, TABLE_RULE_HASH_SIZE, 0, 0, (hash_get_key) get_table_key, (hash_free_key) free_table_ent, 0)) if(hash_init(h, charset_info, 16, 0, 0, (hash_get_key) get_table_key, 0, 0)) exit(EX_EOM); } static my_bool get_one_option(int optid, const struct my_option *opt __attribute__((unused)), char *argument) Loading Loading @@ -633,25 +618,15 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), break; case (int) OPT_IGNORE_TABLE: { uint len= (uint)strlen(argument); TABLE_RULE_ENT* e; if (!strchr(argument, '.')) { fprintf(stderr, "Illegal use of option --ignore-table=<database>.<table>\n"); exit(1); } /* len is always > 0 because we know the there exists a '.' */ e= (TABLE_RULE_ENT*)my_malloc(sizeof(TABLE_RULE_ENT) + len, MYF(MY_WME)); if (!e) exit(EX_EOM); e->key= (char*)e + sizeof(TABLE_RULE_ENT); e->key_len= len; memcpy(e->key, argument, len); if (!hash_inited(&ignore_table)) init_table_rule_hash(&ignore_table); if(my_hash_insert(&ignore_table, (byte*)e)) if (my_hash_insert(&ignore_table, (byte*)my_strdup(argument, MYF(0)))) exit(EX_EOM); break; } Loading Loading @@ -955,7 +930,28 @@ static char *quote_name(const char *name, char *buff, my_bool force) return buff; } /* quote_name */ /* Quote a table name so it can be used in "SHOW TABLES LIKE <tabname>" SYNOPSIS quote_for_like name - name of the table buff - quoted name of the table DESCRIPTION Quote \, _, ' and % characters Note: Because MySQL uses the C escape syntax in strings (for example, '\n' to represent newline), you must double any '\' that you use in your LIKE strings. For example, to search for '\n', specify it as '\\n'. To search for '\', specify it as '\\\\' (the backslashes are stripped once by the parser and another time when the pattern match is done, leaving a single backslash to be matched). Example: "t\1" => "t\\\\1" */ static char *quote_for_like(const char *name, char *buff) { Loading @@ -963,7 +959,13 @@ static char *quote_for_like(const char *name, char *buff) *to++= '\''; while (*name) { if (*name == '\'' || *name == '_' || *name == '\\' || *name == '%') if (*name == '\\') { *to++='\\'; *to++='\\'; *to++='\\'; } else if (*name == '\'' || *name == '_' || *name == '%') *to++= '\\'; *to++= *name++; } Loading Loading @@ -1114,6 +1116,7 @@ static uint getTableStructure(char *table, char* db) FILE *sql_file = md_result_file; int len; DBUG_ENTER("getTableStructure"); DBUG_PRINT("enter", ("db: %s, table: %s", db, table)); if (!insert_pat_inited) { Loading Loading @@ -2165,6 +2168,7 @@ static int get_actual_table_name(const char *old_table_name, char query[50 + 2*NAME_LEN]; char show_name_buff[FN_REFLEN]; DBUG_ENTER("get_actual_table_name"); DBUG_PRINT("enter", ("old_table_name: %s", old_table_name)); /* Check memory for quote_for_like() */ DBUG_ASSERT(2*sizeof(old_table_name) < sizeof(show_name_buff)); Loading @@ -2186,36 +2190,72 @@ static int get_actual_table_name(const char *old_table_name, row= mysql_fetch_row( tableRes ); strmake(new_table_name, row[0], buf_size-1); retval = 0; DBUG_PRINT("info", ("new_table_name: %s", new_table_name)); } mysql_free_result(tableRes); } return retval; DBUG_PRINT("exit", ("retval: %d", retval)); DBUG_RETURN(retval); } static int dump_selected_tables(char *db, char **table_names, int tables) { uint numrows; uint numrows, i; char table_buff[NAME_LEN*+3]; char new_table_name[NAME_LEN]; DYNAMIC_STRING lock_tables_query; HASH dump_tables; DBUG_ENTER("dump_selected_tables"); if (init_dumping(db)) return 1; /* Init hash table for storing the actual name of tables to dump */ if (hash_init(&dump_tables, charset_info, 16, 0, 0, (hash_get_key) get_table_key, 0, 0)) exit(EX_EOM); init_dynamic_string(&lock_tables_query, "LOCK TABLES ", 256, 1024); for (; tables > 0 ; tables-- , table_names++) { /* the table name passed on commandline may be wrong case */ if (!get_actual_table_name( *table_names, new_table_name, sizeof(new_table_name) )) { /* Add found table name to lock_tables_query */ if (lock_tables) { DYNAMIC_STRING query; int i; dynstr_append(&lock_tables_query, quote_name(new_table_name, table_buff, 1)); dynstr_append(&lock_tables_query, " READ /*!32311 LOCAL */,"); } init_dynamic_string(&query, "LOCK TABLES ", 256, 1024); for (i=0 ; i < tables ; i++) /* Add found table name to dump_tables list */ if (my_hash_insert(&dump_tables, (byte*)my_strdup(new_table_name, MYF(0)))) exit(EX_EOM); } else { dynstr_append(&query, quote_name(table_names[i], table_buff, 1)); dynstr_append(&query, " READ /*!32311 LOCAL */,"); my_printf_error(0,"Couldn't find table: \"%s\"\n", MYF(0), *table_names); safe_exit(EX_ILLEGAL_TABLE); /* We shall countinue here, if --force was given */ } if (mysql_real_query(sock, query.str, query.length-1)) } if (lock_tables) { if (mysql_real_query(sock, lock_tables_query.str, lock_tables_query.length-1)) DBerror(sock, "when doing LOCK TABLES"); /* We shall countinue here, if --force was given */ dynstr_free(&query); } dynstr_free(&lock_tables_query); if (flush_logs) { if (mysql_refresh(sock, REFRESH_LOG)) Loading @@ -2224,20 +2264,20 @@ static int dump_selected_tables(char *db, char **table_names, int tables) } if (opt_xml) print_xml_tag1(md_result_file, "", "database name=", db, "\n"); for (; tables > 0 ; tables-- , table_names++) { char new_table_name[NAME_LEN]; /* the table name passed on commandline may be wrong case */ if (!get_actual_table_name( *table_names, new_table_name, sizeof(new_table_name) )) /* Dump each selected table */ const char *table_name; for (i= 0 ; i < dump_tables.records ; i++) { numrows = getTableStructure(new_table_name, db); table_name= hash_element(&dump_tables, i); DBUG_PRINT("info",("Dumping table %s", table_name)); numrows = getTableStructure(table_name, db); if (!dFlag && numrows > 0) dumpTable(numrows, new_table_name); dumpTable(numrows, table_name); } hash_free(&dump_tables); my_free(order_by, MYF(MY_ALLOW_ZERO_PTR)); order_by= 0; } if (opt_xml) { fputs("</database>\n", md_result_file); Loading @@ -2245,7 +2285,7 @@ static int dump_selected_tables(char *db, char **table_names, int tables) } if (lock_tables) mysql_query_with_error_report(sock, 0, "UNLOCK TABLES"); return 0; DBUG_RETURN(0); } /* dump_selected_tables */ Loading client/mysqltest.c +32 −3 Original line number Diff line number Diff line Loading @@ -787,7 +787,7 @@ int var_set(const char *var_name, const char *var_name_end, } else v = var_reg + digit; return eval_expr(v, var_val, (const char**)&var_val_end); DBUG_RETURN(eval_expr(v, var_val, (const char**)&var_val_end)); } Loading Loading @@ -961,9 +961,38 @@ static void do_exec(struct st_query* q) replace_dynstr_append_mem(ds, buf, strlen(buf)); } error= pclose(res_file); if (error != 0) die("command \"%s\" failed", cmd); { uint status= WEXITSTATUS(error); if(q->abort_on_error) die("At line %u: command \"%s\" failed", start_lineno, cmd); else { DBUG_PRINT("info", ("error: %d, status: %d", error, status)); bool ok= 0; uint i; for (i=0 ; (uint) i < q->expected_errors ; i++) { DBUG_PRINT("info", ("expected error: %d", q->expected_errno[i].code.errnum)); if ((q->expected_errno[i].type == ERR_ERRNO) && (q->expected_errno[i].code.errnum == status)) ok= 1; verbose_msg("At line %u: command \"%s\" failed with expected error: %d", start_lineno, cmd, status); } if (!ok) die("At line: %u: command \"%s\" failed with wrong error: %d", start_lineno, cmd, status); } } else if (q->expected_errno[0].type == ERR_ERRNO && q->expected_errno[0].code.errnum != 0) { /* Error code we wanted was != 0, i.e. not an expected success */ die("At line: %u: command \"%s\" succeeded - should have failed with errno %d...", start_lineno, cmd, q->expected_errno[0].code.errnum); } if (!disable_result_log) { Loading mysql-test/mysql-test-run.sh +3 −0 Original line number Diff line number Diff line Loading @@ -689,6 +689,9 @@ MYSQL_CLIENT_TEST="$MYSQL_CLIENT_TEST --no-defaults --testcase --user=root --soc if [ "x$USE_EMBEDDED_SERVER" = "x1" ]; then MYSQL_CLIENT_TEST="$MYSQL_CLIENT_TEST -A --language=$LANGUAGE -A --datadir=$SLAVE_MYDDIR -A --character-sets-dir=$CHARSETSDIR" fi # Save path and name of mysqldump MYSQL_DUMP_DIR="$MYSQL_DUMP" export MYSQL_DUMP_DIR MYSQL_DUMP="$MYSQL_DUMP --no-defaults -uroot --socket=$MASTER_MYSOCK --password=$DBPASSWD $EXTRA_MYSQLDUMP_OPT" MYSQL_BINLOG="$MYSQL_BINLOG --no-defaults --local-load=$MYSQL_TMP_DIR $EXTRA_MYSQLBINLOG_OPT" MYSQL_FIX_SYSTEM_TABLES="$MYSQL_FIX_SYSTEM_TABLES --no-defaults --host=localhost --port=$MASTER_MYPORT --socket=$MASTER_MYSOCK --user=root --password=$DBPASSWD --basedir=$BASEDIR --bindir=$CLIENT_BINDIR --verbose" Loading mysql-test/r/mysqldump.result +87 −0 Original line number Diff line number Diff line Loading @@ -1349,3 +1349,90 @@ UNLOCK TABLES; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; DROP TABLE t1; CREATE DATABASE mysqldump_test_db; USE mysqldump_test_db; CREATE TABLE t1 ( a INT ); CREATE TABLE t2 ( a INT ); INSERT INTO t1 VALUES (1), (2); INSERT INTO t2 VALUES (1), (2); /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; DROP TABLE IF EXISTS `t1`; CREATE TABLE `t1` ( `a` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; DROP TABLE IF EXISTS `t2`; CREATE TABLE `t2` ( `a` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; DROP TABLE IF EXISTS `t1`; CREATE TABLE `t1` ( `a` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; DROP TABLE IF EXISTS `t2`; CREATE TABLE `t2` ( `a` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; DROP TABLE t1, t2; DROP DATABASE mysqldump_test_db; create database mysqldump_test_db; use mysqldump_test_db; create table t1(a varchar(30) primary key, b int not null); create table t2(a varchar(30) primary key, b int not null); create table t3(a varchar(30) primary key, b int not null); test_sequence ------ Testing with illegal table names ------ MYSQL_DUMP_DIR: Couldn't find table: "\d-2-1.sql" MYSQL_DUMP_DIR: Couldn't find table: "\t1" MYSQL_DUMP_DIR: Couldn't find table: "\t1" MYSQL_DUMP_DIR: Couldn't find table: "\\t1" MYSQL_DUMP_DIR: Couldn't find table: "t\1" MYSQL_DUMP_DIR: Couldn't find table: "t\1" MYSQL_DUMP_DIR: Couldn't find table: "t/1" test_sequence ------ Testing with illegal database names ------ MYSQL_DUMP_DIR: Got error: 1049: Unknown database 'mysqldump_test_d' when selecting the database MYSQL_DUMP_DIR: Got error: 1102: Incorrect database name 'mysqld\ump_test_db' when selecting the database drop table t1, t2, t3; drop database mysqldump_test_db; mysql-test/r/ndb_autodiscover.result +17 −3 Original line number Diff line number Diff line Loading @@ -93,7 +93,7 @@ name char(20), a int, b float, c char(24) ERROR 42S01: Table 't3' already exists show status like 'handler_discover%'; Variable_name Value Handler_discover 1 Handler_discover 0 create table IF NOT EXISTS t3( id int not null primary key, id2 int not null, Loading @@ -101,7 +101,7 @@ name char(20) ) engine=ndb; show status like 'handler_discover%'; Variable_name Value Handler_discover 2 Handler_discover 0 SHOW CREATE TABLE t3; Table Create Table t3 CREATE TABLE `t3` ( Loading @@ -114,7 +114,7 @@ id name 1 Explorer show status like 'handler_discover%'; Variable_name Value Handler_discover 2 Handler_discover 1 drop table t3; flush status; create table t7( Loading Loading @@ -358,6 +358,20 @@ Database mysql test use test; CREATE TABLE sys.SYSTAB_0 (a int); ERROR 42S01: Table 'SYSTAB_0' already exists select * from sys.SYSTAB_0; ERROR HY000: Failed to open 'SYSTAB_0', error while unpacking from engine CREATE TABLE IF NOT EXISTS sys.SYSTAB_0 (a int); show warnings; Level Code Message select * from sys.SYSTAB_0; ERROR HY000: Failed to open 'SYSTAB_0', error while unpacking from engine drop table sys.SYSTAB_0; ERROR 42S02: Unknown table 'SYSTAB_0' drop table IF EXISTS sys.SYSTAB_0; Warnings: Note 1051 Unknown table 'SYSTAB_0' CREATE TABLE t9 ( a int NOT NULL PRIMARY KEY, b int Loading Loading
client/mysqldump.c +98 −58 Original line number Diff line number Diff line Loading @@ -57,6 +57,7 @@ #define EX_CONSCHECK 3 #define EX_EOM 4 #define EX_EOF 5 /* ferror for output file was got */ #define EX_ILLEGAL_TABLE 6 /* index into 'show fields from table' */ Loading Loading @@ -140,14 +141,6 @@ const char *compatible_mode_names[]= TYPELIB compatible_mode_typelib= {array_elements(compatible_mode_names) - 1, "", compatible_mode_names, NULL}; #define TABLE_RULE_HASH_SIZE 16 typedef struct st_table_rule_ent { char* key; /* dbname.tablename */ uint key_len; } TABLE_RULE_ENT; HASH ignore_table; static struct my_option my_long_options[] = Loading Loading @@ -538,29 +531,21 @@ static void write_footer(FILE *sql_file) } /* write_footer */ static void free_table_ent(TABLE_RULE_ENT* e) { my_free((gptr) e, MYF(0)); } static byte* get_table_key(TABLE_RULE_ENT* e, uint* len, byte* get_table_key(const char *entry, uint *length, my_bool not_used __attribute__((unused))) { *len= e->key_len; return (byte*)e->key; *length= strlen(entry); return (byte*) entry; } void init_table_rule_hash(HASH* h) { if(hash_init(h, charset_info, TABLE_RULE_HASH_SIZE, 0, 0, (hash_get_key) get_table_key, (hash_free_key) free_table_ent, 0)) if(hash_init(h, charset_info, 16, 0, 0, (hash_get_key) get_table_key, 0, 0)) exit(EX_EOM); } static my_bool get_one_option(int optid, const struct my_option *opt __attribute__((unused)), char *argument) Loading Loading @@ -633,25 +618,15 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), break; case (int) OPT_IGNORE_TABLE: { uint len= (uint)strlen(argument); TABLE_RULE_ENT* e; if (!strchr(argument, '.')) { fprintf(stderr, "Illegal use of option --ignore-table=<database>.<table>\n"); exit(1); } /* len is always > 0 because we know the there exists a '.' */ e= (TABLE_RULE_ENT*)my_malloc(sizeof(TABLE_RULE_ENT) + len, MYF(MY_WME)); if (!e) exit(EX_EOM); e->key= (char*)e + sizeof(TABLE_RULE_ENT); e->key_len= len; memcpy(e->key, argument, len); if (!hash_inited(&ignore_table)) init_table_rule_hash(&ignore_table); if(my_hash_insert(&ignore_table, (byte*)e)) if (my_hash_insert(&ignore_table, (byte*)my_strdup(argument, MYF(0)))) exit(EX_EOM); break; } Loading Loading @@ -955,7 +930,28 @@ static char *quote_name(const char *name, char *buff, my_bool force) return buff; } /* quote_name */ /* Quote a table name so it can be used in "SHOW TABLES LIKE <tabname>" SYNOPSIS quote_for_like name - name of the table buff - quoted name of the table DESCRIPTION Quote \, _, ' and % characters Note: Because MySQL uses the C escape syntax in strings (for example, '\n' to represent newline), you must double any '\' that you use in your LIKE strings. For example, to search for '\n', specify it as '\\n'. To search for '\', specify it as '\\\\' (the backslashes are stripped once by the parser and another time when the pattern match is done, leaving a single backslash to be matched). Example: "t\1" => "t\\\\1" */ static char *quote_for_like(const char *name, char *buff) { Loading @@ -963,7 +959,13 @@ static char *quote_for_like(const char *name, char *buff) *to++= '\''; while (*name) { if (*name == '\'' || *name == '_' || *name == '\\' || *name == '%') if (*name == '\\') { *to++='\\'; *to++='\\'; *to++='\\'; } else if (*name == '\'' || *name == '_' || *name == '%') *to++= '\\'; *to++= *name++; } Loading Loading @@ -1114,6 +1116,7 @@ static uint getTableStructure(char *table, char* db) FILE *sql_file = md_result_file; int len; DBUG_ENTER("getTableStructure"); DBUG_PRINT("enter", ("db: %s, table: %s", db, table)); if (!insert_pat_inited) { Loading Loading @@ -2165,6 +2168,7 @@ static int get_actual_table_name(const char *old_table_name, char query[50 + 2*NAME_LEN]; char show_name_buff[FN_REFLEN]; DBUG_ENTER("get_actual_table_name"); DBUG_PRINT("enter", ("old_table_name: %s", old_table_name)); /* Check memory for quote_for_like() */ DBUG_ASSERT(2*sizeof(old_table_name) < sizeof(show_name_buff)); Loading @@ -2186,36 +2190,72 @@ static int get_actual_table_name(const char *old_table_name, row= mysql_fetch_row( tableRes ); strmake(new_table_name, row[0], buf_size-1); retval = 0; DBUG_PRINT("info", ("new_table_name: %s", new_table_name)); } mysql_free_result(tableRes); } return retval; DBUG_PRINT("exit", ("retval: %d", retval)); DBUG_RETURN(retval); } static int dump_selected_tables(char *db, char **table_names, int tables) { uint numrows; uint numrows, i; char table_buff[NAME_LEN*+3]; char new_table_name[NAME_LEN]; DYNAMIC_STRING lock_tables_query; HASH dump_tables; DBUG_ENTER("dump_selected_tables"); if (init_dumping(db)) return 1; /* Init hash table for storing the actual name of tables to dump */ if (hash_init(&dump_tables, charset_info, 16, 0, 0, (hash_get_key) get_table_key, 0, 0)) exit(EX_EOM); init_dynamic_string(&lock_tables_query, "LOCK TABLES ", 256, 1024); for (; tables > 0 ; tables-- , table_names++) { /* the table name passed on commandline may be wrong case */ if (!get_actual_table_name( *table_names, new_table_name, sizeof(new_table_name) )) { /* Add found table name to lock_tables_query */ if (lock_tables) { DYNAMIC_STRING query; int i; dynstr_append(&lock_tables_query, quote_name(new_table_name, table_buff, 1)); dynstr_append(&lock_tables_query, " READ /*!32311 LOCAL */,"); } init_dynamic_string(&query, "LOCK TABLES ", 256, 1024); for (i=0 ; i < tables ; i++) /* Add found table name to dump_tables list */ if (my_hash_insert(&dump_tables, (byte*)my_strdup(new_table_name, MYF(0)))) exit(EX_EOM); } else { dynstr_append(&query, quote_name(table_names[i], table_buff, 1)); dynstr_append(&query, " READ /*!32311 LOCAL */,"); my_printf_error(0,"Couldn't find table: \"%s\"\n", MYF(0), *table_names); safe_exit(EX_ILLEGAL_TABLE); /* We shall countinue here, if --force was given */ } if (mysql_real_query(sock, query.str, query.length-1)) } if (lock_tables) { if (mysql_real_query(sock, lock_tables_query.str, lock_tables_query.length-1)) DBerror(sock, "when doing LOCK TABLES"); /* We shall countinue here, if --force was given */ dynstr_free(&query); } dynstr_free(&lock_tables_query); if (flush_logs) { if (mysql_refresh(sock, REFRESH_LOG)) Loading @@ -2224,20 +2264,20 @@ static int dump_selected_tables(char *db, char **table_names, int tables) } if (opt_xml) print_xml_tag1(md_result_file, "", "database name=", db, "\n"); for (; tables > 0 ; tables-- , table_names++) { char new_table_name[NAME_LEN]; /* the table name passed on commandline may be wrong case */ if (!get_actual_table_name( *table_names, new_table_name, sizeof(new_table_name) )) /* Dump each selected table */ const char *table_name; for (i= 0 ; i < dump_tables.records ; i++) { numrows = getTableStructure(new_table_name, db); table_name= hash_element(&dump_tables, i); DBUG_PRINT("info",("Dumping table %s", table_name)); numrows = getTableStructure(table_name, db); if (!dFlag && numrows > 0) dumpTable(numrows, new_table_name); dumpTable(numrows, table_name); } hash_free(&dump_tables); my_free(order_by, MYF(MY_ALLOW_ZERO_PTR)); order_by= 0; } if (opt_xml) { fputs("</database>\n", md_result_file); Loading @@ -2245,7 +2285,7 @@ static int dump_selected_tables(char *db, char **table_names, int tables) } if (lock_tables) mysql_query_with_error_report(sock, 0, "UNLOCK TABLES"); return 0; DBUG_RETURN(0); } /* dump_selected_tables */ Loading
client/mysqltest.c +32 −3 Original line number Diff line number Diff line Loading @@ -787,7 +787,7 @@ int var_set(const char *var_name, const char *var_name_end, } else v = var_reg + digit; return eval_expr(v, var_val, (const char**)&var_val_end); DBUG_RETURN(eval_expr(v, var_val, (const char**)&var_val_end)); } Loading Loading @@ -961,9 +961,38 @@ static void do_exec(struct st_query* q) replace_dynstr_append_mem(ds, buf, strlen(buf)); } error= pclose(res_file); if (error != 0) die("command \"%s\" failed", cmd); { uint status= WEXITSTATUS(error); if(q->abort_on_error) die("At line %u: command \"%s\" failed", start_lineno, cmd); else { DBUG_PRINT("info", ("error: %d, status: %d", error, status)); bool ok= 0; uint i; for (i=0 ; (uint) i < q->expected_errors ; i++) { DBUG_PRINT("info", ("expected error: %d", q->expected_errno[i].code.errnum)); if ((q->expected_errno[i].type == ERR_ERRNO) && (q->expected_errno[i].code.errnum == status)) ok= 1; verbose_msg("At line %u: command \"%s\" failed with expected error: %d", start_lineno, cmd, status); } if (!ok) die("At line: %u: command \"%s\" failed with wrong error: %d", start_lineno, cmd, status); } } else if (q->expected_errno[0].type == ERR_ERRNO && q->expected_errno[0].code.errnum != 0) { /* Error code we wanted was != 0, i.e. not an expected success */ die("At line: %u: command \"%s\" succeeded - should have failed with errno %d...", start_lineno, cmd, q->expected_errno[0].code.errnum); } if (!disable_result_log) { Loading
mysql-test/mysql-test-run.sh +3 −0 Original line number Diff line number Diff line Loading @@ -689,6 +689,9 @@ MYSQL_CLIENT_TEST="$MYSQL_CLIENT_TEST --no-defaults --testcase --user=root --soc if [ "x$USE_EMBEDDED_SERVER" = "x1" ]; then MYSQL_CLIENT_TEST="$MYSQL_CLIENT_TEST -A --language=$LANGUAGE -A --datadir=$SLAVE_MYDDIR -A --character-sets-dir=$CHARSETSDIR" fi # Save path and name of mysqldump MYSQL_DUMP_DIR="$MYSQL_DUMP" export MYSQL_DUMP_DIR MYSQL_DUMP="$MYSQL_DUMP --no-defaults -uroot --socket=$MASTER_MYSOCK --password=$DBPASSWD $EXTRA_MYSQLDUMP_OPT" MYSQL_BINLOG="$MYSQL_BINLOG --no-defaults --local-load=$MYSQL_TMP_DIR $EXTRA_MYSQLBINLOG_OPT" MYSQL_FIX_SYSTEM_TABLES="$MYSQL_FIX_SYSTEM_TABLES --no-defaults --host=localhost --port=$MASTER_MYPORT --socket=$MASTER_MYSOCK --user=root --password=$DBPASSWD --basedir=$BASEDIR --bindir=$CLIENT_BINDIR --verbose" Loading
mysql-test/r/mysqldump.result +87 −0 Original line number Diff line number Diff line Loading @@ -1349,3 +1349,90 @@ UNLOCK TABLES; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; DROP TABLE t1; CREATE DATABASE mysqldump_test_db; USE mysqldump_test_db; CREATE TABLE t1 ( a INT ); CREATE TABLE t2 ( a INT ); INSERT INTO t1 VALUES (1), (2); INSERT INTO t2 VALUES (1), (2); /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; DROP TABLE IF EXISTS `t1`; CREATE TABLE `t1` ( `a` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; DROP TABLE IF EXISTS `t2`; CREATE TABLE `t2` ( `a` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; DROP TABLE IF EXISTS `t1`; CREATE TABLE `t1` ( `a` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; DROP TABLE IF EXISTS `t2`; CREATE TABLE `t2` ( `a` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; DROP TABLE t1, t2; DROP DATABASE mysqldump_test_db; create database mysqldump_test_db; use mysqldump_test_db; create table t1(a varchar(30) primary key, b int not null); create table t2(a varchar(30) primary key, b int not null); create table t3(a varchar(30) primary key, b int not null); test_sequence ------ Testing with illegal table names ------ MYSQL_DUMP_DIR: Couldn't find table: "\d-2-1.sql" MYSQL_DUMP_DIR: Couldn't find table: "\t1" MYSQL_DUMP_DIR: Couldn't find table: "\t1" MYSQL_DUMP_DIR: Couldn't find table: "\\t1" MYSQL_DUMP_DIR: Couldn't find table: "t\1" MYSQL_DUMP_DIR: Couldn't find table: "t\1" MYSQL_DUMP_DIR: Couldn't find table: "t/1" test_sequence ------ Testing with illegal database names ------ MYSQL_DUMP_DIR: Got error: 1049: Unknown database 'mysqldump_test_d' when selecting the database MYSQL_DUMP_DIR: Got error: 1102: Incorrect database name 'mysqld\ump_test_db' when selecting the database drop table t1, t2, t3; drop database mysqldump_test_db;
mysql-test/r/ndb_autodiscover.result +17 −3 Original line number Diff line number Diff line Loading @@ -93,7 +93,7 @@ name char(20), a int, b float, c char(24) ERROR 42S01: Table 't3' already exists show status like 'handler_discover%'; Variable_name Value Handler_discover 1 Handler_discover 0 create table IF NOT EXISTS t3( id int not null primary key, id2 int not null, Loading @@ -101,7 +101,7 @@ name char(20) ) engine=ndb; show status like 'handler_discover%'; Variable_name Value Handler_discover 2 Handler_discover 0 SHOW CREATE TABLE t3; Table Create Table t3 CREATE TABLE `t3` ( Loading @@ -114,7 +114,7 @@ id name 1 Explorer show status like 'handler_discover%'; Variable_name Value Handler_discover 2 Handler_discover 1 drop table t3; flush status; create table t7( Loading Loading @@ -358,6 +358,20 @@ Database mysql test use test; CREATE TABLE sys.SYSTAB_0 (a int); ERROR 42S01: Table 'SYSTAB_0' already exists select * from sys.SYSTAB_0; ERROR HY000: Failed to open 'SYSTAB_0', error while unpacking from engine CREATE TABLE IF NOT EXISTS sys.SYSTAB_0 (a int); show warnings; Level Code Message select * from sys.SYSTAB_0; ERROR HY000: Failed to open 'SYSTAB_0', error while unpacking from engine drop table sys.SYSTAB_0; ERROR 42S02: Unknown table 'SYSTAB_0' drop table IF EXISTS sys.SYSTAB_0; Warnings: Note 1051 Unknown table 'SYSTAB_0' CREATE TABLE t9 ( a int NOT NULL PRIMARY KEY, b int Loading