From d4afbd487abbe9e5f3e4fc6c44974639e123406a Mon Sep 17 00:00:00 2001 From: andrey Date: Wed, 16 May 2012 14:28:55 +0200 Subject: [PATCH] Fix for bug#62046 Bug#62046 mysqli@mysqlnd can't iterate over stored sets after call to mysqli_stmt_reset(). Stmt's state was changed to STMT_PREPARED and leads the driver to think that the stmt was just prepared. Because result set exist also for only prepared but not executed sets, the check for stmt->result isn't any good. There is a result set, because as response for COM_PREPARE the server sends metadata and metadata is part of a result set. After COM_EXECUTE the server sends metadata again, which could be different and in this case more correct. --- ext/mysqli/tests/bug62046.phpt | 40 ++++++++++++++++++++++++++++++++++ ext/mysqlnd/mysqlnd_ps.c | 2 -- 2 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 ext/mysqli/tests/bug62046.phpt diff --git a/ext/mysqli/tests/bug62046.phpt b/ext/mysqli/tests/bug62046.phpt new file mode 100644 index 00000000000..31a7328b701 --- /dev/null +++ b/ext/mysqli/tests/bug62046.phpt @@ -0,0 +1,40 @@ +--TEST-- +Bug #62046 mysqli@mysqlnd can't iterate over stored sets after call to mysqli_stmt_reset() +--SKIPIF-- + +--FILE-- +prepare('SELECT 42'))) { + printf("[002] Prepare failed, [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + } + if (FALSE === $stmt->execute()) { + printf("[003] Execute failed, [%d] %s\n", $stmt->errorno, $stmt->error); + } + if (FALSE === $stmt->store_result()) { + printf("[004] store_result failed, [%d] %s\n", $stmt->errorno, $stmt->error); + } + $one = NULL; + if (FALSE === $stmt->bind_result($one)) { + printf("[005] bind_result failed, [%d] %s\n", $stmt->errorno, $stmt->error); + } + if (FALSE === $stmt->reset()) { + printf("[006] bind_result failed, [%d] %s\n", $stmt->errorno, $stmt->error); + } + while ($stmt->fetch()) { + var_dump($one); + } + $stmt->close(); + $link->close(); + echo "done!"; +?> +--EXPECT-- +int(42) +done! \ No newline at end of file diff --git a/ext/mysqlnd/mysqlnd_ps.c b/ext/mysqlnd/mysqlnd_ps.c index 2044390715f..d762689a92f 100644 --- a/ext/mysqlnd/mysqlnd_ps.c +++ b/ext/mysqlnd/mysqlnd_ps.c @@ -1265,8 +1265,6 @@ MYSQLND_METHOD(mysqlnd_stmt, reset)(MYSQLND_STMT * const s TSRMLS_DC) stmt->error_info = conn->error_info; } stmt->upsert_status = conn->upsert_status; - - stmt->state = MYSQLND_STMT_PREPARED; } DBG_INF(ret == PASS? "PASS":"FAIL"); DBG_RETURN(ret);