diff options
author | unknown <kroki/tomash@moonlight.intranet> | 2006-11-17 12:21:32 +0300 |
---|---|---|
committer | unknown <kroki/tomash@moonlight.intranet> | 2006-11-17 12:21:32 +0300 |
commit | 2d04b1914de45129569d08dceb74f647f3004563 (patch) | |
tree | 592172c85c268458ccc191a7b7cfcc764879e8e8 /tests | |
parent | c6d317831ab8ccbef3685a5f03ca8c2cfa4d92f0 (diff) | |
download | mariadb-git-2d04b1914de45129569d08dceb74f647f3004563.tar.gz |
BUG#23383: mysql_affected_rows() returns different values than
mysql_stmt_affected_rows()
The problem was that affected_rows for prepared statement wasn't updated
in the client library on the error. The solution is to always update
affected_rows, which will be equal to -1 on the error.
libmysql/libmysql.c:
Update status variables even in the case of an error. Some variables
have a defined value on the error (like affected_rows is -1), others are
undefined, so updating them won't harm.
libmysqld/lib_sql.cc:
Update status variables even in the case of an error. Some variables
have a defined value on the error (like affected_rows is -1), others are
undefined, so updating them won't harm.
tests/mysql_client_test.c:
Add test for bug#23383: mysql_affected_rows() returns different values
than mysql_stmt_affected_rows().
Diffstat (limited to 'tests')
-rw-r--r-- | tests/mysql_client_test.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c index b1ee144e517..e123b2e42ae 100644 --- a/tests/mysql_client_test.c +++ b/tests/mysql_client_test.c @@ -11950,6 +11950,83 @@ static void test_bug21726() /* + BUG#23383: mysql_affected_rows() returns different values than + mysql_stmt_affected_rows() + + Test that both mysql_affected_rows() and mysql_stmt_affected_rows() + return -1 on error, 0 when no rows were affected, and (positive) row + count when some rows were affected. +*/ +static void test_bug23383() +{ + const char *insert_query= "INSERT INTO t1 VALUES (1), (2)"; + const char *update_query= "UPDATE t1 SET i= 4 WHERE i = 3"; + MYSQL_STMT *stmt; + my_ulonglong row_count; + int rc; + + DBUG_ENTER("test_bug23383"); + myheader("test_bug23383"); + + rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1"); + myquery(rc); + + rc= mysql_query(mysql, "CREATE TABLE t1 (i INT UNIQUE)"); + myquery(rc); + + rc= mysql_query(mysql, insert_query); + myquery(rc); + row_count= mysql_affected_rows(mysql); + DIE_UNLESS(row_count == 2); + + rc= mysql_query(mysql, insert_query); + DIE_UNLESS(rc != 0); + row_count= mysql_affected_rows(mysql); + DIE_UNLESS(row_count == (my_ulonglong)-1); + + rc= mysql_query(mysql, update_query); + myquery(rc); + row_count= mysql_affected_rows(mysql); + DIE_UNLESS(row_count == 0); + + rc= mysql_query(mysql, "DELETE FROM t1"); + myquery(rc); + + stmt= mysql_stmt_init(mysql); + DIE_UNLESS(stmt != 0); + + rc= mysql_stmt_prepare(stmt, insert_query, strlen(insert_query)); + check_execute(stmt, rc); + + rc= mysql_stmt_execute(stmt); + check_execute(stmt, rc); + row_count= mysql_stmt_affected_rows(stmt); + DIE_UNLESS(row_count == 2); + + rc= mysql_stmt_execute(stmt); + DIE_UNLESS(rc != 0); + row_count= mysql_stmt_affected_rows(stmt); + DIE_UNLESS(row_count == (my_ulonglong)-1); + + rc= mysql_stmt_prepare(stmt, update_query, strlen(update_query)); + check_execute(stmt, rc); + + rc= mysql_stmt_execute(stmt); + check_execute(stmt, rc); + row_count= mysql_stmt_affected_rows(stmt); + DIE_UNLESS(row_count == 0); + + rc= mysql_stmt_close(stmt); + check_execute(stmt, rc); + + rc= mysql_query(mysql, "DROP TABLE t1"); + myquery(rc); + + DBUG_VOID_RETURN; +} + + +/* Read and parse arguments and MySQL options from my.cnf */ @@ -12176,6 +12253,7 @@ static struct my_tests_st my_tests[]= { { "test_bug15613", test_bug15613 }, { "test_bug20152", test_bug20152 }, { "test_bug21726", test_bug21726 }, + { "test_bug23383", test_bug23383 }, { 0, 0 } }; |