diff options
author | kostja@bodhi.(none) <> | 2007-12-12 18:21:01 +0300 |
---|---|---|
committer | kostja@bodhi.(none) <> | 2007-12-12 18:21:01 +0300 |
commit | ebb9c5d9838f333a73fb197d2bb59ff4ccab6fb9 (patch) | |
tree | 6d167294e7739c87e6a12c0d29fa35aa57b0ae36 /libmysql/libmysql.c | |
parent | aa5786eb0f3fbde0a0c8278de22897a8f0fec0e8 (diff) | |
download | mariadb-git-ebb9c5d9838f333a73fb197d2bb59ff4ccab6fb9.tar.gz |
Bug#12713 "Error in a stored function called from a SELECT doesn't
cause ROLLBACK of statement", part 1. Review fixes.
Do not send OK/EOF packets to the client until we reached the end of
the current statement.
This is a consolidation, to keep the functionality that is shared by all
SQL statements in one place in the server.
Currently this functionality includes:
- close_thread_tables()
- log_slow_statement().
After this patch and the subsequent patch for Bug#12713, it shall also include:
- ha_autocommit_or_rollback()
- net_end_statement()
- query_cache_end_of_result().
In future it may also include:
- mysql_reset_thd_for_next_command().
Diffstat (limited to 'libmysql/libmysql.c')
-rw-r--r-- | libmysql/libmysql.c | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index bf5dd7d63eb..f5ac1c09248 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -440,11 +440,11 @@ static void expand_error(MYSQL* mysql, int error) char tmp[MYSQL_ERRMSG_SIZE]; char *p; uint err_length; - strmake(tmp, mysql->net.last_error, MYSQL_ERRMSG_SIZE-1); - p = strmake(mysql->net.last_error, ER(error), MYSQL_ERRMSG_SIZE-1); - err_length= (uint) (p - mysql->net.last_error); + strmake(tmp, mysql->net.client_last_error, MYSQL_ERRMSG_SIZE-1); + p = strmake(mysql->net.client_last_error, ER(error), MYSQL_ERRMSG_SIZE-1); + err_length= (uint) (p - mysql->net.client_last_error); strmake(p, tmp, MYSQL_ERRMSG_SIZE-1 - err_length); - mysql->net.last_errno = error; + mysql->net.client_last_errno = error; } /* @@ -870,9 +870,10 @@ my_bool handle_local_infile(MYSQL *mysql, const char *net_filename) VOID(my_net_write(net,(const uchar*) "",0)); /* Server needs one packet */ net_flush(net); strmov(net->sqlstate, unknown_sqlstate); - net->last_errno= (*options->local_infile_error)(li_ptr, - net->last_error, - sizeof(net->last_error)-1); + net->client_last_errno= + (*options->local_infile_error)(li_ptr, + net->client_last_error, + sizeof(net->client_last_error)-1); goto err; } @@ -899,9 +900,10 @@ my_bool handle_local_infile(MYSQL *mysql, const char *net_filename) if (readcount < 0) { - net->last_errno= (*options->local_infile_error)(li_ptr, - net->last_error, - sizeof(net->last_error)-1); + net->client_last_errno= + (*options->local_infile_error)(li_ptr, + net->client_last_error, + sizeof(net->client_last_error)-1); goto err; } @@ -1395,7 +1397,7 @@ const char *cli_read_statistics(MYSQL *mysql) if (!mysql->net.read_pos[0]) { set_mysql_error(mysql, CR_WRONG_HOST_INFO, unknown_sqlstate); - return mysql->net.last_error; + return mysql->net.client_last_error; } return (char*) mysql->net.read_pos; } @@ -1406,7 +1408,7 @@ mysql_stat(MYSQL *mysql) { DBUG_ENTER("mysql_stat"); if (simple_command(mysql,COM_STATISTICS,0,0,0)) - DBUG_RETURN(mysql->net.last_error); + DBUG_RETURN(mysql->net.client_last_error); DBUG_RETURN((*mysql->methods->read_statistics)(mysql)); } @@ -1771,7 +1773,7 @@ static my_bool my_realloc_str(NET *net, ulong length) if (res) { strmov(net->sqlstate, unknown_sqlstate); - strmov(net->last_error, ER(net->last_errno)); + strmov(net->client_last_error, ER(net->client_last_errno)); } net->write_pos= net->buff+ buf_length; } @@ -1822,13 +1824,15 @@ void set_stmt_error(MYSQL_STMT * stmt, int errcode, void set_stmt_errmsg(MYSQL_STMT *stmt, NET *net) { DBUG_ENTER("set_stmt_errmsg"); - DBUG_PRINT("enter", ("error: %d/%s '%s'", net->last_errno, net->sqlstate, - net->last_error)); + DBUG_PRINT("enter", ("error: %d/%s '%s'", + net->client_last_errno, + net->sqlstate, + net->client_last_error)); DBUG_ASSERT(stmt != 0); - stmt->last_errno= net->last_errno; - if (net->last_error && net->last_error[0]) - strmov(stmt->last_error, net->last_error); + stmt->last_errno= net->client_last_errno; + if (net->client_last_error && net->client_last_error[0]) + strmov(stmt->last_error, net->client_last_error); strmov(stmt->sqlstate, net->sqlstate); DBUG_VOID_RETURN; |