summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlia Alshanetsky <iliaa@php.net>2006-12-02 17:53:44 +0000
committerIlia Alshanetsky <iliaa@php.net>2006-12-02 17:53:44 +0000
commit916673a345347b15c628f8fee9814f84ee5b2ff8 (patch)
tree8cf58a381cd0302b2e1c55c0f02c0be913f2be0f
parent66eb5b1dde5fb30eaadd1645da1f5f1b8cfaec3c (diff)
downloadphp-git-916673a345347b15c628f8fee9814f84ee5b2ff8.tar.gz
Fixed bug #39527 (Failure to retrieve results when multiple unbuffered,
prepared statements are used in pdo_mysql).
-rw-r--r--NEWS2
-rw-r--r--ext/pdo/tests/pdo_016.phpt4
-rwxr-xr-xext/pdo/tests/pdo_016a.phpt4
-rw-r--r--ext/pdo/tests/pdo_021.phpt4
-rwxr-xr-xext/pdo_mysql/mysql_statement.c36
5 files changed, 37 insertions, 13 deletions
diff --git a/NEWS b/NEWS
index 622c3a43fa..974abb8c02 100644
--- a/NEWS
+++ b/NEWS
@@ -77,6 +77,8 @@ PHP NEWS
number of backslashes). (David Soria Parra, Pierre)
- Fixed bug #39534 (Error in maths to calculate of
ZEND_MM_ALIGNED_MIN_HEADER_SIZE). (wharmby at uk dot ibm dot com, Dmitry)
+- Fixed bug #39527 (Failure to retrieve results when multiple unbuffered,
+ prepared statements are used in pdo_mysql). (Ilia)
- Fixed bug #39458 (ftp_nlist() returns false on empty dirs). (Nuno)
- Fixed bug #39454 (Returning a SOAP array segfaults PHP). (Dmitry)
- Fixed bug #39445 (Calling debug_backtrace() in the __toString() function
diff --git a/ext/pdo/tests/pdo_016.phpt b/ext/pdo/tests/pdo_016.phpt
index 8d193d37e0..f3aba13e0e 100644
--- a/ext/pdo/tests/pdo_016.phpt
+++ b/ext/pdo/tests/pdo_016.phpt
@@ -14,6 +14,10 @@ if (getenv('REDIR_TEST_DIR') === false) putenv('REDIR_TEST_DIR='.dirname(__FILE_
require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
$db = PDOTest::factory();
+if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') {
+ $db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
+}
+
$db->exec('CREATE TABLE test(idx int NOT NULL PRIMARY KEY, txt VARCHAR(20))');
$db->exec('INSERT INTO test VALUES(0, \'String0\')');
$db->exec('INSERT INTO test VALUES(1, \'String1\')');
diff --git a/ext/pdo/tests/pdo_016a.phpt b/ext/pdo/tests/pdo_016a.phpt
index cdb9dd7a80..00b75aecad 100755
--- a/ext/pdo/tests/pdo_016a.phpt
+++ b/ext/pdo/tests/pdo_016a.phpt
@@ -14,6 +14,10 @@ if (getenv('REDIR_TEST_DIR') === false) putenv('REDIR_TEST_DIR='.dirname(__FILE_
require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
$db = PDOTest::factory();
+if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') {
+ $db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
+}
+
$db->exec('CREATE TABLE test(idx int NOT NULL PRIMARY KEY, txt VARCHAR(20))');
$db->exec('INSERT INTO test VALUES(0, \'String0\')');
$db->exec('INSERT INTO test VALUES(1, \'String1\')');
diff --git a/ext/pdo/tests/pdo_021.phpt b/ext/pdo/tests/pdo_021.phpt
index 104c3394d0..688bd4a618 100644
--- a/ext/pdo/tests/pdo_021.phpt
+++ b/ext/pdo/tests/pdo_021.phpt
@@ -14,6 +14,10 @@ if (getenv('REDIR_TEST_DIR') === false) putenv('REDIR_TEST_DIR='.dirname(__FILE_
require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
$db = PDOTest::factory();
+if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') {
+ $db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
+}
+
$db->exec('CREATE TABLE test(id INT NOT NULL PRIMARY KEY, val VARCHAR(10), val2 VARCHAR(16))');
$select = $db->prepare('SELECT COUNT(id) FROM test');
diff --git a/ext/pdo_mysql/mysql_statement.c b/ext/pdo_mysql/mysql_statement.c
index 920702b3c9..856b23286c 100755
--- a/ext/pdo_mysql/mysql_statement.c
+++ b/ext/pdo_mysql/mysql_statement.c
@@ -68,15 +68,17 @@ static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt TSRMLS_DC)
}
#endif
#if HAVE_MYSQL_NEXT_RESULT
- while (mysql_more_results(S->H->server)) {
- MYSQL_RES *res;
- if (mysql_next_result(S->H->server) != 0) {
- break;
- }
+ if (S->H->server) {
+ while (mysql_more_results(S->H->server)) {
+ MYSQL_RES *res;
+ if (mysql_next_result(S->H->server) != 0) {
+ break;
+ }
- res = mysql_store_result(S->H->server);
- if (res) {
- mysql_free_result(res);
+ res = mysql_store_result(S->H->server);
+ if (res) {
+ mysql_free_result(res);
+ }
}
}
#endif
@@ -593,16 +595,24 @@ static int pdo_mysql_stmt_col_meta(pdo_stmt_t *stmt, long colno, zval *return_va
static int pdo_mysql_stmt_cursor_closer(pdo_stmt_t *stmt TSRMLS_DC)
{
pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data;
+
+ if (S->result) {
+ mysql_free_result(S->result);
+ S->result = NULL;
+ }
#if HAVE_MYSQL_STMT_PREPARE
if (S->stmt) {
- int retval = mysql_stmt_free_result(S->stmt);
+ int retval;
+ if (!S->H->buffered) {
+ retval = mysql_stmt_close(S->stmt);
+ S->stmt = NULL;
+ } else {
+ retval = mysql_stmt_free_result(S->stmt);
+ }
return retval ? 0 : 1;
}
#endif
- if (S->result) {
- mysql_free_result(S->result);
- S->result = NULL;
- }
+
#if HAVE_MYSQL_NEXT_RESULT
while (mysql_more_results(S->H->server)) {
MYSQL_RES *res;