Commit 050d992b authored by unknown's avatar unknown

Bug #12984 mysqltest.test: different output from "exec NonExistsinfComamdn"

 - Common error handling regardless of --ps-protocol or not.


client/mysqltest.c:
  Merge normal_handle_error and run_query_stmt_handle_error to get consistent functionality and error messages regardless if --ps-protocol is used or not
  Call handle_error when error occured to check for expected error codes/states
  Call handle_no_error when no error ahs occured to check if an error was expected
parent 8bb92058
...@@ -481,9 +481,10 @@ my_bool mysql_rpl_probe(MYSQL *mysql __attribute__((unused))) { return 1; } ...@@ -481,9 +481,10 @@ my_bool mysql_rpl_probe(MYSQL *mysql __attribute__((unused))) { return 1; }
static void replace_dynstr_append_mem(DYNAMIC_STRING *ds, const char *val, static void replace_dynstr_append_mem(DYNAMIC_STRING *ds, const char *val,
int len); int len);
static void replace_dynstr_append(DYNAMIC_STRING *ds, const char *val); static void replace_dynstr_append(DYNAMIC_STRING *ds, const char *val);
static int normal_handle_error(const char *query, struct st_query *q, static int handle_error(const char *query, struct st_query *q,
MYSQL *mysql, DYNAMIC_STRING *ds); unsigned int err_errno, const char *err_error,
static int normal_handle_no_error(struct st_query *q); const char *err_sqlstate, DYNAMIC_STRING *ds);
static int handle_no_error(struct st_query *q);
static void do_eval(DYNAMIC_STRING* query_eval, const char *query) static void do_eval(DYNAMIC_STRING* query_eval, const char *query)
{ {
...@@ -2071,11 +2072,12 @@ int connect_n_handle_errors(struct st_query *q, MYSQL* con, const char* host, ...@@ -2071,11 +2072,12 @@ int connect_n_handle_errors(struct st_query *q, MYSQL* con, const char* host,
if (!mysql_real_connect(con, host, user, pass, db, port, sock ? sock: 0, if (!mysql_real_connect(con, host, user, pass, db, port, sock ? sock: 0,
CLIENT_MULTI_STATEMENTS)) CLIENT_MULTI_STATEMENTS))
{ {
error= normal_handle_error("connect", q, con, ds); error= handle_error("connect", q, mysql_errno(con), mysql_error(con),
mysql_sqlstate(con), ds);
*create_conn= 0; *create_conn= 0;
goto err; goto err;
} }
else if (normal_handle_no_error(q)) else if (handle_no_error(q))
{ {
/* /*
Fail if there was no error but we expected it. Fail if there was no error but we expected it.
...@@ -2964,8 +2966,6 @@ static void append_result(DYNAMIC_STRING *ds, MYSQL_RES *res) ...@@ -2964,8 +2966,6 @@ static void append_result(DYNAMIC_STRING *ds, MYSQL_RES *res)
static int run_query_normal(MYSQL *mysql, struct st_query *q, int flags); static int run_query_normal(MYSQL *mysql, struct st_query *q, int flags);
static int run_query_stmt (MYSQL *mysql, struct st_query *q, int flags); static int run_query_stmt (MYSQL *mysql, struct st_query *q, int flags);
static void run_query_stmt_handle_warnings(MYSQL *mysql, DYNAMIC_STRING *ds); static void run_query_stmt_handle_warnings(MYSQL *mysql, DYNAMIC_STRING *ds);
static int run_query_stmt_handle_error(char *query, struct st_query *q,
MYSQL_STMT *stmt, DYNAMIC_STRING *ds);
static void run_query_display_metadata(MYSQL_FIELD *field, uint num_fields, static void run_query_display_metadata(MYSQL_FIELD *field, uint num_fields,
DYNAMIC_STRING *ds); DYNAMIC_STRING *ds);
...@@ -3049,12 +3049,13 @@ static int run_query_normal(MYSQL* mysql, struct st_query* q, int flags) ...@@ -3049,12 +3049,13 @@ static int run_query_normal(MYSQL* mysql, struct st_query* q, int flags)
(!(last_result= res= mysql_store_result(mysql)) && (!(last_result= res= mysql_store_result(mysql)) &&
mysql_field_count(mysql))) mysql_field_count(mysql)))
{ {
if (normal_handle_error(query, q, mysql, ds)) if (handle_error(query, q, mysql_errno(mysql), mysql_error(mysql),
mysql_sqlstate(mysql), ds))
error= 1; error= 1;
goto end; goto end;
} }
if (normal_handle_no_error(q)) if (handle_no_error(q))
{ {
error= 1; error= 1;
goto end; goto end;
...@@ -3169,14 +3170,15 @@ static int run_query_normal(MYSQL* mysql, struct st_query* q, int flags) ...@@ -3169,14 +3170,15 @@ static int run_query_normal(MYSQL* mysql, struct st_query* q, int flags)
/* /*
Handle errors which occurred after execution of conventional (non-prepared) Handle errors which occurred after execution
statement.
SYNOPSIS SYNOPSIS
normal_handle_error() handle_error()
query - query string query - query string
q - query context q - query context
mysql - connection through which query was sent to server err_errno - error number
err_error - error message
err_sqlstate - sql state
ds - dynamic string which is used for output buffer ds - dynamic string which is used for output buffer
NOTE NOTE
...@@ -3188,35 +3190,35 @@ static int run_query_normal(MYSQL* mysql, struct st_query* q, int flags) ...@@ -3188,35 +3190,35 @@ static int run_query_normal(MYSQL* mysql, struct st_query* q, int flags)
1 - Some other error was expected. 1 - Some other error was expected.
*/ */
static int normal_handle_error(const char *query, struct st_query *q, static int handle_error(const char *query, struct st_query *q,
MYSQL *mysql, DYNAMIC_STRING *ds) unsigned int err_errno, const char *err_error,
const char* err_sqlstate, DYNAMIC_STRING *ds)
{ {
uint i; uint i;
DBUG_ENTER("normal_handle_error"); DBUG_ENTER("handle_error");
if (q->require_file) if (q->require_file)
abort_not_supported_test(); abort_not_supported_test();
if (q->abort_on_error) if (q->abort_on_error)
die("query '%s' failed: %d: %s", query, die("query '%s' failed: %d: %s", query,
mysql_errno(mysql), mysql_error(mysql)); err_errno, err_error);
else
{
for (i= 0 ; (uint) i < q->expected_errors ; i++) for (i= 0 ; (uint) i < q->expected_errors ; i++)
{ {
if (((q->expected_errno[i].type == ERR_ERRNO) && if (((q->expected_errno[i].type == ERR_ERRNO) &&
(q->expected_errno[i].code.errnum == mysql_errno(mysql))) || (q->expected_errno[i].code.errnum == err_errno)) ||
((q->expected_errno[i].type == ERR_SQLSTATE) && ((q->expected_errno[i].type == ERR_SQLSTATE) &&
(strcmp(q->expected_errno[i].code.sqlstate, mysql_sqlstate(mysql)) == 0))) (strcmp(q->expected_errno[i].code.sqlstate, err_sqlstate) == 0)))
{ {
if (q->expected_errors == 1) if (q->expected_errors == 1)
{ {
/* Only log error if there is one possible error */ /* Only log error if there is one possible error */
dynstr_append_mem(ds, "ERROR ", 6); dynstr_append_mem(ds, "ERROR ", 6);
replace_dynstr_append(ds, mysql_sqlstate(mysql)); replace_dynstr_append(ds, err_sqlstate);
dynstr_append_mem(ds, ": ", 2); dynstr_append_mem(ds, ": ", 2);
replace_dynstr_append(ds, mysql_error(mysql)); replace_dynstr_append(ds, err_error);
dynstr_append_mem(ds,"\n",1); dynstr_append_mem(ds,"\n",1);
} }
/* Don't log error if we may not get an error */ /* Don't log error if we may not get an error */
...@@ -3232,20 +3234,20 @@ static int normal_handle_error(const char *query, struct st_query *q, ...@@ -3232,20 +3234,20 @@ static int normal_handle_error(const char *query, struct st_query *q,
DBUG_PRINT("info",("i: %d expected_errors: %d", i, q->expected_errors)); DBUG_PRINT("info",("i: %d expected_errors: %d", i, q->expected_errors));
dynstr_append_mem(ds, "ERROR ",6); dynstr_append_mem(ds, "ERROR ",6);
replace_dynstr_append(ds, mysql_sqlstate(mysql)); replace_dynstr_append(ds, err_sqlstate);
dynstr_append_mem(ds, ": ", 2); dynstr_append_mem(ds, ": ", 2);
replace_dynstr_append(ds, mysql_error(mysql)); replace_dynstr_append(ds, err_error);
dynstr_append_mem(ds, "\n", 1); dynstr_append_mem(ds, "\n", 1);
if (i) if (i)
{ {
if (q->expected_errno[0].type == ERR_ERRNO) if (q->expected_errno[0].type == ERR_ERRNO)
verbose_msg("query '%s' failed with wrong errno %d instead of %d...", verbose_msg("query '%s' failed with wrong errno %d instead of %d...",
q->query, mysql_errno(mysql), q->query, err_errno,
q->expected_errno[0].code.errnum); q->expected_errno[0].code.errnum);
else else
verbose_msg("query '%s' failed with wrong sqlstate %s instead of %s...", verbose_msg("query '%s' failed with wrong sqlstate %s instead of %s...",
q->query, mysql_sqlstate(mysql), q->query, err_sqlstate,
q->expected_errno[0].code.sqlstate); q->expected_errno[0].code.sqlstate);
DBUG_RETURN(1); DBUG_RETURN(1);
} }
...@@ -3254,19 +3256,17 @@ static int normal_handle_error(const char *query, struct st_query *q, ...@@ -3254,19 +3256,17 @@ static int normal_handle_error(const char *query, struct st_query *q,
If we do not abort on error, failure to run the query does not fail the If we do not abort on error, failure to run the query does not fail the
whole test case. whole test case.
*/ */
verbose_msg("query '%s' failed: %d: %s", q->query, mysql_errno(mysql), verbose_msg("query '%s' failed: %d: %s", q->query, err_errno,
mysql_error(mysql)); err_error);
DBUG_RETURN(0); DBUG_RETURN(0);
}
return 0; /* Keep compiler happy */
} }
/* /*
Handle absence of errors after execution of convetional statement. Handle absence of errors after execution
SYNOPSIS SYNOPSIS
normal_handle_error() handle_no_error()
q - context of query q - context of query
RETURN VALUE RETURN VALUE
...@@ -3274,9 +3274,9 @@ static int normal_handle_error(const char *query, struct st_query *q, ...@@ -3274,9 +3274,9 @@ static int normal_handle_error(const char *query, struct st_query *q,
1 - Some error was expected from this query. 1 - Some error was expected from this query.
*/ */
static int normal_handle_no_error(struct st_query *q) static int handle_no_error(struct st_query *q)
{ {
DBUG_ENTER("normal_handle_no_error"); DBUG_ENTER("handle_no_error");
if (q->expected_errno[0].type == ERR_ERRNO && if (q->expected_errno[0].type == ERR_ERRNO &&
q->expected_errno[0].code.errnum != 0) q->expected_errno[0].code.errnum != 0)
...@@ -3370,17 +3370,17 @@ static int run_query_stmt(MYSQL *mysql, struct st_query *q, int flags) ...@@ -3370,17 +3370,17 @@ static int run_query_stmt(MYSQL *mysql, struct st_query *q, int flags)
{ {
if (q->abort_on_error) if (q->abort_on_error)
{ {
die("unable to prepare statement '%s': " die("query '%s' failed: %d: %s", query,
"%s (mysql_stmt_errno=%d returned=%d)", mysql_stmt_errno(stmt), mysql_stmt_error(stmt));
query,
mysql_stmt_error(stmt), mysql_stmt_errno(stmt), err);
} }
else else
{ {
/* /*
Preparing is part of normal execution and some errors may be expected Preparing is part of normal execution and some errors may be expected
*/ */
error= run_query_stmt_handle_error(query, q, stmt, ds); error= handle_error(query, q, mysql_stmt_errno(stmt),
mysql_stmt_error(stmt), mysql_stmt_sqlstate(stmt),
ds);
goto end; goto end;
} }
} }
...@@ -3413,7 +3413,9 @@ static int run_query_stmt(MYSQL *mysql, struct st_query *q, int flags) ...@@ -3413,7 +3413,9 @@ static int run_query_stmt(MYSQL *mysql, struct st_query *q, int flags)
else else
{ {
/* We got an error, maybe expected */ /* We got an error, maybe expected */
error= run_query_stmt_handle_error(query, q, stmt, ds); error= handle_error(query, q, mysql_stmt_errno(stmt),
mysql_stmt_error(stmt), mysql_stmt_sqlstate(stmt),
ds);
goto end; goto end;
} }
} }
...@@ -3449,18 +3451,16 @@ static int run_query_stmt(MYSQL *mysql, struct st_query *q, int flags) ...@@ -3449,18 +3451,16 @@ static int run_query_stmt(MYSQL *mysql, struct st_query *q, int flags)
else else
{ {
/* We got an error, maybe expected */ /* We got an error, maybe expected */
error= run_query_stmt_handle_error(query, q, stmt, ds); error= handle_error(query, q, mysql_stmt_errno(stmt),
mysql_stmt_error(stmt), mysql_stmt_sqlstate(stmt),
ds);
goto end; goto end;
} }
} }
/* If we got here the statement was both executed and read succeesfully */ /* If we got here the statement was both executed and read succeesfully */
if (handle_no_error(q))
if (q->expected_errno[0].type == ERR_ERRNO &&
q->expected_errno[0].code.errnum != 0)
{ {
verbose_msg("query '%s' succeeded - should have failed with errno %d...",
q->query, q->expected_errno[0].code.errnum);
error= 1; error= 1;
goto end; goto end;
} }
...@@ -3740,71 +3740,6 @@ static void run_query_stmt_handle_warnings(MYSQL *mysql, DYNAMIC_STRING *ds) ...@@ -3740,71 +3740,6 @@ static void run_query_stmt_handle_warnings(MYSQL *mysql, DYNAMIC_STRING *ds)
} }
static int run_query_stmt_handle_error(char *query, struct st_query *q,
MYSQL_STMT *stmt, DYNAMIC_STRING *ds)
{
if (q->require_file) /* FIXME don't understand this one */
{
abort_not_supported_test();
}
if (q->abort_on_error)
die("query '%s' failed: %d: %s", query,
mysql_stmt_errno(stmt), mysql_stmt_error(stmt));
else
{
int i;
for (i=0 ; (uint) i < q->expected_errors ; i++)
{
if (((q->expected_errno[i].type == ERR_ERRNO) &&
(q->expected_errno[i].code.errnum == mysql_stmt_errno(stmt))) ||
((q->expected_errno[i].type == ERR_SQLSTATE) &&
(strcmp(q->expected_errno[i].code.sqlstate,
mysql_stmt_sqlstate(stmt)) == 0)))
{
if (i == 0 && q->expected_errors == 1)
{
/* Only log error if there is one possible error */
dynstr_append_mem(ds,"ERROR ",6);
replace_dynstr_append(ds, mysql_stmt_sqlstate(stmt));
dynstr_append_mem(ds, ": ", 2);
replace_dynstr_append(ds,mysql_stmt_error(stmt));
dynstr_append_mem(ds,"\n",1);
}
/* Don't log error if we may not get an error */
else if (q->expected_errno[0].type == ERR_SQLSTATE ||
(q->expected_errno[0].type == ERR_ERRNO &&
q->expected_errno[0].code.errnum != 0))
dynstr_append(ds,"Got one of the listed errors\n");
return 0; /* Ok */
}
}
DBUG_PRINT("info",("i: %d expected_errors: %d", i,
q->expected_errors));
dynstr_append_mem(ds, "ERROR ",6);
replace_dynstr_append(ds, mysql_stmt_sqlstate(stmt));
dynstr_append_mem(ds,": ",2);
replace_dynstr_append(ds, mysql_stmt_error(stmt));
dynstr_append_mem(ds,"\n",1);
if (i)
{
verbose_msg("query '%s' failed with wrong errno %d instead of %d...",
q->query, mysql_stmt_errno(stmt), q->expected_errno[0]);
return 1; /* Error */
}
verbose_msg("query '%s' failed: %d: %s", q->query, mysql_stmt_errno(stmt),
mysql_stmt_error(stmt));
/*
if we do not abort on error, failure to run the query does
not fail the whole test case
*/
return 0;
}
return 0;
}
/****************************************************************************\ /****************************************************************************\
* Functions to match SQL statements that can be prepared * Functions to match SQL statements that can be prepared
\****************************************************************************/ \****************************************************************************/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment