summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authorunknown <msvensson@neptunus.(none)>2005-06-21 14:24:13 +0200
committerunknown <msvensson@neptunus.(none)>2005-06-21 14:24:13 +0200
commit2af65b1d712834884e0865c5b2e45cfa22ef36c5 (patch)
treea8d211fb6cdf815f6c61ca67e2a34afe7cafa94e /client
parent06b1e941090c9ec1d7f54d388cd618e529bf99eb (diff)
parentc2a84d5fd2e3d86ab5dd75b13d6dac7a8a06256f (diff)
downloadmariadb-git-2af65b1d712834884e0865c5b2e45cfa22ef36c5.tar.gz
Merge bk-internal.mysql.com:/home/bk/mysql-4.1
into neptunus.(none):/home/msvensson/mysql/mysql-4.1 client/mysqltest.c: Auto merged mysql-test/mysql-test-run.sh: Auto merged sql/ha_ndbcluster.cc: Auto merged
Diffstat (limited to 'client')
-rw-r--r--client/mysqldump.c156
-rw-r--r--client/mysqltest.c35
2 files changed, 130 insertions, 61 deletions
diff --git a/client/mysqldump.c b/client/mysqldump.c
index 7b18b1d92da..207235983da 100644
--- a/client/mysqldump.c
+++ b/client/mysqldump.c
@@ -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' */
@@ -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[] =
@@ -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,
- my_bool not_used __attribute__((unused)))
+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)
@@ -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;
}
@@ -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)
{
@@ -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++;
}
@@ -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)
{
@@ -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));
@@ -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;
- if (lock_tables)
+
+ /* 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++)
{
- DYNAMIC_STRING query;
- int i;
- init_dynamic_string(&query, "LOCK TABLES ", 256, 1024);
- for (i=0 ; i < tables ; i++)
+ /* the table name passed on commandline may be wrong case */
+ if (!get_actual_table_name( *table_names,
+ new_table_name, sizeof(new_table_name) ))
{
- dynstr_append(&query, quote_name(table_names[i], table_buff, 1));
- dynstr_append(&query, " READ /*!32311 LOCAL */,");
+ /* Add found table name to lock_tables_query */
+ if (lock_tables)
+ {
+ dynstr_append(&lock_tables_query,
+ quote_name(new_table_name, table_buff, 1));
+ dynstr_append(&lock_tables_query, " READ /*!32311 LOCAL */,");
+ }
+
+ /* 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);
+
}
- if (mysql_real_query(sock, query.str, query.length-1))
+ else
+ {
+ 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 (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))
@@ -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++)
+
+ /* Dump each selected table */
+ const char *table_name;
+ for (i= 0 ; i < dump_tables.records ; i++)
{
- 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) ))
- {
- numrows = getTableStructure(new_table_name, db);
- if (!dFlag && numrows > 0)
- dumpTable(numrows, new_table_name);
- }
- my_free(order_by, MYF(MY_ALLOW_ZERO_PTR));
- order_by= 0;
+ 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, 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);
@@ -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 */
diff --git a/client/mysqltest.c b/client/mysqltest.c
index 131616b6f71..77736fc1fcc 100644
--- a/client/mysqltest.c
+++ b/client/mysqltest.c
@@ -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));
}
@@ -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)
{