From 0c65a68fc9c545a62ae7b0d2fc61b19441284379 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Wed, 6 Feb 2008 14:11:32 +0000 Subject: [PATCH] Fix a bug and a test --- .../tests/mysqli_stmt_affected_rows.phpt | 66 ++++++++++++++++++- ext/mysqlnd/mysqlnd_result.c | 6 +- 2 files changed, 67 insertions(+), 5 deletions(-) diff --git a/ext/mysqli/tests/mysqli_stmt_affected_rows.phpt b/ext/mysqli/tests/mysqli_stmt_affected_rows.phpt index 5a8ce8af80..65e41a25e8 100644 --- a/ext/mysqli/tests/mysqli_stmt_affected_rows.phpt +++ b/ext/mysqli/tests/mysqli_stmt_affected_rows.phpt @@ -160,17 +160,77 @@ require_once('skipifconnectfailure.inc'); if (1 !== ($tmp = mysqli_stmt_affected_rows($stmt))) printf("[029] Expecting int/1, got %s/%s\n", gettype($tmp), $tmp); + if (!mysqli_stmt_prepare($stmt, 'SELECT label FROM test WHERE id = 100') || + !mysqli_stmt_execute($stmt)) + printf("[030] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); + + /* use it like num_rows */ + /* PS are unbuffered, num_rows cannot determine the row count before all rows have been fetched and/or buffered */ + if (-1 !== ($tmp = mysqli_stmt_affected_rows($stmt))) + printf("[031] Expecting int/-1, got %s/%s\n", gettype($tmp), $tmp); + + if (0 !== ($tmp = mysqli_stmt_num_rows($stmt))) + printf("[032] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp); + + if (!mysqli_stmt_store_result($stmt)) + printf("[033] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); + + if (1 !== ($tmp = mysqli_stmt_affected_rows($stmt))) + printf("[034] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp); + + if (1 !== ($tmp = mysqli_stmt_num_rows($stmt))) + printf("[035] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp); + + mysqli_stmt_free_result($stmt); + mysqli_stmt_close($stmt); + $stmt = mysqli_stmt_init($link); + + if (!mysqli_stmt_prepare($stmt, 'SELECT label FROM test WHERE 1 = 2') || + !mysqli_stmt_execute($stmt)) + printf("[036] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); + + /* use it like num_rows */ + if (-1 !== ($tmp = mysqli_stmt_affected_rows($stmt))) + printf("[037] Expecting int/-1, got %s/%s\n", gettype($tmp), $tmp); + + if (true !== ($tmp = mysqli_stmt_store_result($stmt))) + printf("[038] Expecting boolean/true, got %s\%s\n", gettype($tmp), $tmp); + + if (0 !== ($tmp = mysqli_stmt_num_rows($stmt))) + printf("[039] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp); + + if (0 !== ($tmp = mysqli_stmt_affected_rows($stmt))) + printf("[040] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp); + + /* try to use stmt_affected_rows like stmt_num_rows */ + /* stmt_affected_rows is not really meant for SELECT! */ + if (mysqli_stmt_prepare($stmt, 'SELECT unknown_column FROM this_table_does_not_exist') || + mysqli_stmt_execute($stmt)) + printf("[041] The invalid SELECT statement is issued on purpose\n"); + + if (-1 !== ($tmp = mysqli_stmt_affected_rows($stmt))) + printf("[042] Expecting int/-1, got %s/%s\n", gettype($tmp), $tmp); + + if (false !== ($tmp = mysqli_stmt_store_result($stmt))) + printf("[043] Expecting boolean/false, got %s\%s\n", gettype($tmp), $tmp); + + if (0 !== ($tmp = mysqli_stmt_num_rows($stmt))) + printf("[044] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp); + + if (-1 !== ($tmp = mysqli_stmt_affected_rows($stmt))) + printf("[045] Expecting int/-1, got %s/%s\n", gettype($tmp), $tmp); + mysqli_stmt_close($stmt); $stmt = mysqli_stmt_init($link); if (!mysqli_stmt_prepare($stmt, "DROP TABLE IF EXISTS test") || !mysqli_stmt_execute($stmt)) - printf("[030] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); + printf("[046] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); mysqli_stmt_close($stmt); if (!is_null($tmp = mysqli_stmt_affected_rows($stmt))) - printf("[031] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp); + printf("[047] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp); mysqli_close($link); @@ -180,4 +240,4 @@ require_once('skipifconnectfailure.inc'); [009] [%d] (error message varies with the MySQL Server version, check the error code) Warning: mysqli_stmt_affected_rows(): Couldn't fetch mysqli_stmt in %s on line %d -done! \ No newline at end of file +done! diff --git a/ext/mysqlnd/mysqlnd_result.c b/ext/mysqlnd/mysqlnd_result.c index 46d47893e5..0d4804f50a 100644 --- a/ext/mysqlnd/mysqlnd_result.c +++ b/ext/mysqlnd/mysqlnd_result.c @@ -372,7 +372,6 @@ static void mysqlnd_internal_free_result(MYSQLND_RES *result TSRMLS_DC) { DBG_ENTER("mysqlnd_internal_free_result"); - result->m.free_result_contents(result TSRMLS_CC); if (result->conn) { @@ -439,6 +438,7 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC ret = FAIL; PACKET_INIT_ALLOCA(rset_header, PROT_RSET_HEADER_PACKET); do { + SET_ERROR_AFF_ROWS(conn); if (FAIL == (ret = PACKET_READ_ALLOCA(rset_header, conn))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error reading result set's header"); break; @@ -455,7 +455,6 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC safe to unconditionally turn off the flag here. */ conn->upsert_status.server_status &= ~SERVER_MORE_RESULTS_EXISTS; - conn->upsert_status.affected_rows = -1; /* This will copy the error code and the messages, as they are buffers in the struct @@ -507,6 +506,9 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_RSET_QUERY); memset(&conn->upsert_status, 0, sizeof(conn->upsert_status)); + /* restore after zeroing */ + SET_ERROR_AFF_ROWS(conn); + conn->last_query_type = QUERY_SELECT; CONN_SET_STATE(conn, CONN_FETCHING_DATA); /* PS has already allocated it */ -- 2.50.1