statements). (Nikita)
. Fixed bug #78152 (PDO::exec() - Bad error handling with multiple commands).
(Nikita)
+ . Fixed bug #66878 (Multiple rowsets not returned unless PDO statement object
+ is unset()). (Nikita)
- Phar:
. Fixed bug #73809 (Phar Zip parse crash - mmap fail). (cmb)
}
#endif
- if (!Z_ISUNDEF(stmt->database_object_handle)
+ if (!S->done && !Z_ISUNDEF(stmt->database_object_handle)
&& IS_OBJ_VALID(EG(objects_store).object_buckets[Z_OBJ_HANDLE(stmt->database_object_handle)])
&& (!(OBJ_FLAGS(Z_OBJ(stmt->database_object_handle)) & IS_OBJ_FREE_CALLED))) {
while (mysql_more_results(S->H->server)) {
PDO_DBG_ENTER("pdo_mysql_stmt_execute");
PDO_DBG_INF_FMT("stmt=%p", S->stmt);
+ S->done = 0;
if (S->stmt) {
PDO_DBG_RETURN(pdo_mysql_stmt_execute_prepared(stmt));
}
if (!H->emulate_prepare) {
if (mysqlnd_stmt_next_result(S->stmt)) {
pdo_mysql_error_stmt(stmt);
+ S->done = 1;
PDO_DBG_RETURN(0);
}
if (mysql_next_result(H->server)) {
pdo_mysql_error_stmt(stmt);
+ S->done = 1;
PDO_DBG_RETURN(0);
} else {
PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt));
PDO_DBG_ENTER("pdo_mysql_stmt_cursor_closer");
PDO_DBG_INF_FMT("stmt=%p", S->stmt);
+
+ S->done = 1;
if (S->result) {
mysql_free_result(S->result);
S->result = NULL;
zend_ulong *out_length;
unsigned int params_given;
unsigned max_length:1;
+ /* Whether all result sets have been fully consumed.
+ * If this flag is not set, they need to be consumed during destruction. */
+ unsigned done:1;
} pdo_mysql_stmt;
extern const pdo_driver_t pdo_mysql_driver;
--- /dev/null
+--TEST--
+Bug #66878: Multiple rowsets not returned unless PDO statement object is unset()
+--SKIPIF--
+<?php
+require_once(__DIR__ . DIRECTORY_SEPARATOR . 'skipif.inc');
+require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
+MySQLPDOTest::skip();
+?>
+--FILE--
+<?php
+require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
+
+$pdo = MySQLPDOTest::factory();
+
+$sql = 'SELECT 123; SELECT 42; SELECT 999';
+
+$stmt = $pdo->query($sql);
+var_dump($stmt->nextRowset());
+var_dump($stmt->nextRowset());
+var_dump($stmt->nextRowset());
+$stmt->closeCursor();
+
+$stmt = $pdo->query($sql);
+var_dump($stmt->nextRowset());
+var_dump($stmt->nextRowset());
+var_dump($stmt->nextRowset());
+$stmt->closeCursor();
+
+?>
+--EXPECT--
+bool(true)
+bool(true)
+bool(false)
+bool(true)
+bool(true)
+bool(false)