summaryrefslogtreecommitdiff
path: root/ext/pdo_mysql/mysql_statement.c
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2020-12-09 14:46:49 +0100
committerNikita Popov <nikita.ppv@gmail.com>2020-12-09 14:46:49 +0100
commit186b76636830a00e2533c7b0aaff4b02d9489376 (patch)
tree9a2e77e7798c6e6d7ab27a7f45dfe093d3ccd90e /ext/pdo_mysql/mysql_statement.c
parent23193e89e4cf3a503473a912154f2c8c9b92ee93 (diff)
downloadphp-git-186b76636830a00e2533c7b0aaff4b02d9489376.tar.gz
PDO MySQL: Make sure nextRowset() works with partially consumed result
This was already working in all cases apart from native prepared statements with unbuffered queries. In that case invoking stmt_free_result() addresses the issue.
Diffstat (limited to 'ext/pdo_mysql/mysql_statement.c')
-rw-r--r--ext/pdo_mysql/mysql_statement.c25
1 files changed, 9 insertions, 16 deletions
diff --git a/ext/pdo_mysql/mysql_statement.c b/ext/pdo_mysql/mysql_statement.c
index 7d0988b384..a8be36c426 100644
--- a/ext/pdo_mysql/mysql_statement.c
+++ b/ext/pdo_mysql/mysql_statement.c
@@ -349,6 +349,15 @@ static int pdo_mysql_stmt_next_rowset(pdo_stmt_t *stmt) /* {{{ */
PDO_DBG_ENTER("pdo_mysql_stmt_next_rowset");
PDO_DBG_INF_FMT("stmt=%p", S->stmt);
+ /* ensure that we free any previous unfetched results */
+ if (S->stmt) {
+ mysql_stmt_free_result(S->stmt);
+ }
+ if (S->result) {
+ mysql_free_result(S->result);
+ S->result = NULL;
+ }
+
#ifdef PDO_USE_MYSQLND
if (!H->emulate_prepare) {
if (!mysqlnd_stmt_more_results(S->stmt)) {
@@ -359,11 +368,6 @@ static int pdo_mysql_stmt_next_rowset(pdo_stmt_t *stmt) /* {{{ */
PDO_DBG_RETURN(0);
}
- /* TODO - this code is stolen from execute() - see above */
- if (S->result) {
- mysql_free_result(S->result);
- S->result = NULL;
- }
{
/* for SHOW/DESCRIBE and others the column/field count is not available before execute */
int i;
@@ -394,17 +398,6 @@ static int pdo_mysql_stmt_next_rowset(pdo_stmt_t *stmt) /* {{{ */
}
#endif
-/* ensure that we free any previous unfetched results */
-#ifndef PDO_USE_MYSQLND
- if (S->stmt) {
- mysql_stmt_free_result(S->stmt);
- }
-#endif
- if (S->result) {
- mysql_free_result(S->result);
- S->result = NULL;
- }
-
if (!mysql_more_results(H->server)) {
/* No more results */
PDO_DBG_RETURN(0);