johannes                                 Mon, 05 Mar 2012 23:38:15 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=323928

Log:
Fix Bug #61207 PDO::nextRowset() after a multi-statement query doesn't always 
work

Bug: https://bugs.php.net/61207 (Assigned) PDO::nextRowset() after a 
multi-statement query doesn't always work
      
Changed paths:
    U   php/php-src/branches/PHP_5_3/ext/pdo_mysql/mysql_statement.c
    A   php/php-src/branches/PHP_5_3/ext/pdo_mysql/tests/bug_61207.phpt
    U   php/php-src/branches/PHP_5_4/ext/pdo_mysql/mysql_statement.c
    A   php/php-src/branches/PHP_5_4/ext/pdo_mysql/tests/bug_61207.phpt
    U   php/php-src/trunk/ext/pdo_mysql/mysql_statement.c
    A   php/php-src/trunk/ext/pdo_mysql/tests/bug_61207.phpt

Modified: php/php-src/branches/PHP_5_3/ext/pdo_mysql/mysql_statement.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/pdo_mysql/mysql_statement.c	2012-03-05 21:22:15 UTC (rev 323927)
+++ php/php-src/branches/PHP_5_3/ext/pdo_mysql/mysql_statement.c	2012-03-05 23:38:15 UTC (rev 323928)
@@ -131,6 +131,39 @@
 }
 /* }}} */

+static int pdo_mysql_fill_stmt_from_result(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */
+{
+	pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data;
+	pdo_mysql_db_handle *H = S->H;
+	my_ulonglong row_count;
+	PDO_DBG_ENTER("pdo_mysql_fill_stmt_from_result");
+
+	row_count = mysql_affected_rows(H->server);
+	if (row_count == (my_ulonglong)-1) {
+		/* we either have a query that returned a result set or an error occured
+		   lets see if we have access to a result set */
+		if (!H->buffered) {
+			S->result = mysql_use_result(H->server);
+		} else {
+			S->result = mysql_store_result(H->server);
+		}
+		if (NULL == S->result) {
+			pdo_mysql_error_stmt(stmt);
+			PDO_DBG_RETURN(0);
+		}
+
+		stmt->row_count = (long) mysql_num_rows(S->result);
+		stmt->column_count = (int) mysql_num_fields(S->result);
+		S->fields = mysql_fetch_fields(S->result);
+	} else {
+		/* this was a DML or DDL query (INSERT, UPDATE, DELETE, ... */
+		stmt->row_count = (long) row_count;
+	}
+
+	PDO_DBG_RETURN(1);
+}
+/* }}} */
+
 #ifdef HAVE_MYSQL_STMT_PREPARE
 static int pdo_mysql_stmt_execute_prepared_libmysql(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */
 {
@@ -310,30 +343,7 @@
 		PDO_DBG_RETURN(0);
 	}

-	row_count = mysql_affected_rows(H->server);
-	if (row_count == (my_ulonglong)-1) {
-		/* we either have a query that returned a result set or an error occured
-		   lets see if we have access to a result set */
-		if (!H->buffered) {
-			S->result = mysql_use_result(H->server);
-		} else {
-			S->result = mysql_store_result(H->server);
-		}
-		if (NULL == S->result) {
-			pdo_mysql_error_stmt(stmt);
-			PDO_DBG_RETURN(0);
-		}
-
-		stmt->row_count = (long) mysql_num_rows(S->result);
-		stmt->column_count = (int) mysql_num_fields(S->result);
-		S->fields = mysql_fetch_fields(S->result);
-
-	} else {
-		/* this was a DML or DDL query (INSERT, UPDATE, DELETE, ... */
-		stmt->row_count = (long) row_count;
-	}
-
-	PDO_DBG_RETURN(1);
+	PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt TSRMLS_CC));
 }
 /* }}} */

@@ -421,25 +431,7 @@
 		/* No more results */
 		PDO_DBG_RETURN(0);
 	} else {
-		if (!H->buffered) {
-			S->result = mysql_use_result(H->server);
-			row_count = 0;
-		} else {
-			S->result = mysql_store_result(H->server);
-			if ((long)-1 == (row_count = (long) mysql_affected_rows(H->server))) {
-				pdo_mysql_error_stmt(stmt);
-				PDO_DBG_RETURN(0);
-			}
-		}
-
-		if (NULL == S->result) {
-			PDO_DBG_RETURN(0);
-		}
-
-		stmt->row_count = row_count;
-		stmt->column_count = (int) mysql_num_fields(S->result);
-		S->fields = mysql_fetch_fields(S->result);
-		PDO_DBG_RETURN(1);
+		PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt TSRMLS_CC));
 	}
 #else
 	strcpy(stmt->error_code, "HYC00");

Added: php/php-src/branches/PHP_5_3/ext/pdo_mysql/tests/bug_61207.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/pdo_mysql/tests/bug_61207.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_3/ext/pdo_mysql/tests/bug_61207.phpt	2012-03-05 23:38:15 UTC (rev 323928)
@@ -0,0 +1,103 @@
+--TEST--
+PDO MySQL Bug #61207 (PDO::nextRowset() after a multi-statement query doesn't always work)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_mysql')) die('skip not loaded');
+require dirname(__FILE__) . '/config.inc';
+require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
+PDOTest::skip();
+?>
+--FILE--
+<?php
+require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
+
+$link = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt');
+
+$link->query('create table `bug61207`( `id` int )');
+
+$handle1 = $link->prepare('insert into bug61207(id) values(1);
+                          select * from bug61207 where id = ?;
+                          update bug61207 set id = 2 where id = ?;');
+
+$handle1->bindValue('1', '1');
+$handle1->bindValue('2', '1');
+
+$handle1->execute();
+$i = 1;
+print("Handle 1:\n");
+do {
+	print('Rowset ' . $i++ . "\n");
+	if ($handle1->columnCount() > 0)
+		print("Results detected\n");
+} while($handle1->nextRowset());
+
+$handle2 = $link->prepare('select * from bug61207 where id = ?;
+                           update bug61207 set id = 1 where id = ?;');
+
+$handle2->bindValue('1', '2');
+$handle2->bindValue('2', '2');
+
+$handle2->execute();
+
+$i = 1;
+print("Handle 2:\n");
+do {
+	print('Rowset ' . $i++ . "\n");
+	if ($handle2->columnCount() > 0)
+		print("Results detected\n");
+} while($handle2->nextRowset());
+
+$handle3 = $link->prepare('update bug61207 set id = 2 where id = ?;
+                           select * from bug61207 where id = ?;');
+
+$handle3->bindValue('1', '1');
+$handle3->bindValue('2', '2');
+
+$handle3->execute();
+
+$i = 1;
+print("Handle 3:\n");
+do {
+	print('Rowset ' . $i++ . "\n");
+	if ($handle3->columnCount() > 0)
+		print("Results detected\n");
+} while($handle3->nextRowset());
+
+$handle4 = $link->prepare('insert into bug61207(id) values(3);
+                           update bug61207 set id = 2 where id = ?;
+                           select * from bug61207 where id = ?;');
+
+$handle4->bindValue('1', '3');
+$handle4->bindValue('2', '2');
+
+$handle4->execute();
+
+$i = 1;
+print("Handle 4:\n");
+do {
+	print('Rowset ' . $i++ . "\n");
+	if ($handle1->columnCount() > 0)
+		print("Results detected\n");
+} while($handle1->nextRowset());
+
+$link->query("DROP TABLE bug61207");
+?>
+--EXPECT--
+Handle 1:
+Rowset 1
+Rowset 2
+Results detected
+Rowset 3
+Handle 2:
+Rowset 1
+Results detected
+Rowset 2
+Handle 3:
+Rowset 1
+Rowset 2
+Results detected
+Handle 4:
+Rowset 1
+Rowset 2
+Rowset 3
+Results detected


Property changes on: php/php-src/branches/PHP_5_3/ext/pdo_mysql/tests/bug_61207.phpt
___________________________________________________________________
Added: svn:keywords
   + Id Rev Revision
Added: svn:eol-style
   + native

Modified: php/php-src/branches/PHP_5_4/ext/pdo_mysql/mysql_statement.c
===================================================================
--- php/php-src/branches/PHP_5_4/ext/pdo_mysql/mysql_statement.c	2012-03-05 21:22:15 UTC (rev 323927)
+++ php/php-src/branches/PHP_5_4/ext/pdo_mysql/mysql_statement.c	2012-03-05 23:38:15 UTC (rev 323928)
@@ -125,6 +125,39 @@
 }
 /* }}} */

+static int pdo_mysql_fill_stmt_from_result(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */
+{
+	pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data;
+	pdo_mysql_db_handle *H = S->H;
+	my_ulonglong row_count;
+	PDO_DBG_ENTER("pdo_mysql_fill_stmt_from_result");
+
+	row_count = mysql_affected_rows(H->server);
+	if (row_count == (my_ulonglong)-1) {
+		/* we either have a query that returned a result set or an error occured
+		   lets see if we have access to a result set */
+		if (!H->buffered) {
+			S->result = mysql_use_result(H->server);
+		} else {
+			S->result = mysql_store_result(H->server);
+		}
+		if (NULL == S->result) {
+			pdo_mysql_error_stmt(stmt);
+			PDO_DBG_RETURN(0);
+		}
+
+		stmt->row_count = (long) mysql_num_rows(S->result);
+		stmt->column_count = (int) mysql_num_fields(S->result);
+		S->fields = mysql_fetch_fields(S->result);
+	} else {
+		/* this was a DML or DDL query (INSERT, UPDATE, DELETE, ... */
+		stmt->row_count = (long) row_count;
+	}
+
+	PDO_DBG_RETURN(1);
+}
+/* }}} */
+
 #ifndef PDO_USE_MYSQLND
 static int pdo_mysql_stmt_execute_prepared_libmysql(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */
 {
@@ -302,30 +335,7 @@
 		PDO_DBG_RETURN(0);
 	}

-	row_count = mysql_affected_rows(H->server);
-	if (row_count == (my_ulonglong)-1) {
-		/* we either have a query that returned a result set or an error occured
-		   lets see if we have access to a result set */
-		if (!H->buffered) {
-			S->result = mysql_use_result(H->server);
-		} else {
-			S->result = mysql_store_result(H->server);
-		}
-		if (NULL == S->result) {
-			pdo_mysql_error_stmt(stmt);
-			PDO_DBG_RETURN(0);
-		}
-
-		stmt->row_count = (long) mysql_num_rows(S->result);
-		stmt->column_count = (int) mysql_num_fields(S->result);
-		S->fields = mysql_fetch_fields(S->result);
-
-	} else {
-		/* this was a DML or DDL query (INSERT, UPDATE, DELETE, ... */
-		stmt->row_count = (long) row_count;
-	}
-
-	PDO_DBG_RETURN(1);
+	PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt TSRMLS_CC));
 }
 /* }}} */

@@ -412,25 +422,7 @@
 		/* No more results */
 		PDO_DBG_RETURN(0);
 	} else {
-		if (!H->buffered) {
-			S->result = mysql_use_result(H->server);
-			row_count = 0;
-		} else {
-			S->result = mysql_store_result(H->server);
-			if ((long)-1 == (row_count = (long) mysql_affected_rows(H->server))) {
-				pdo_mysql_error_stmt(stmt);
-				PDO_DBG_RETURN(0);
-			}
-		}
-
-		if (NULL == S->result) {
-			PDO_DBG_RETURN(0);
-		}
-
-		stmt->row_count = row_count;
-		stmt->column_count = (int) mysql_num_fields(S->result);
-		S->fields = mysql_fetch_fields(S->result);
-		PDO_DBG_RETURN(1);
+		PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt TSRMLS_CC));
 	}
 }
 /* }}} */

Added: php/php-src/branches/PHP_5_4/ext/pdo_mysql/tests/bug_61207.phpt
===================================================================
--- php/php-src/branches/PHP_5_4/ext/pdo_mysql/tests/bug_61207.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_4/ext/pdo_mysql/tests/bug_61207.phpt	2012-03-05 23:38:15 UTC (rev 323928)
@@ -0,0 +1,103 @@
+--TEST--
+PDO MySQL Bug #61207 (PDO::nextRowset() after a multi-statement query doesn't always work)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_mysql')) die('skip not loaded');
+require dirname(__FILE__) . '/config.inc';
+require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
+PDOTest::skip();
+?>
+--FILE--
+<?php
+require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
+
+$link = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt');
+
+$link->query('create table `bug61207`( `id` int )');
+
+$handle1 = $link->prepare('insert into bug61207(id) values(1);
+                          select * from bug61207 where id = ?;
+                          update bug61207 set id = 2 where id = ?;');
+
+$handle1->bindValue('1', '1');
+$handle1->bindValue('2', '1');
+
+$handle1->execute();
+$i = 1;
+print("Handle 1:\n");
+do {
+	print('Rowset ' . $i++ . "\n");
+	if ($handle1->columnCount() > 0)
+		print("Results detected\n");
+} while($handle1->nextRowset());
+
+$handle2 = $link->prepare('select * from bug61207 where id = ?;
+                           update bug61207 set id = 1 where id = ?;');
+
+$handle2->bindValue('1', '2');
+$handle2->bindValue('2', '2');
+
+$handle2->execute();
+
+$i = 1;
+print("Handle 2:\n");
+do {
+	print('Rowset ' . $i++ . "\n");
+	if ($handle2->columnCount() > 0)
+		print("Results detected\n");
+} while($handle2->nextRowset());
+
+$handle3 = $link->prepare('update bug61207 set id = 2 where id = ?;
+                           select * from bug61207 where id = ?;');
+
+$handle3->bindValue('1', '1');
+$handle3->bindValue('2', '2');
+
+$handle3->execute();
+
+$i = 1;
+print("Handle 3:\n");
+do {
+	print('Rowset ' . $i++ . "\n");
+	if ($handle3->columnCount() > 0)
+		print("Results detected\n");
+} while($handle3->nextRowset());
+
+$handle4 = $link->prepare('insert into bug61207(id) values(3);
+                           update bug61207 set id = 2 where id = ?;
+                           select * from bug61207 where id = ?;');
+
+$handle4->bindValue('1', '3');
+$handle4->bindValue('2', '2');
+
+$handle4->execute();
+
+$i = 1;
+print("Handle 4:\n");
+do {
+	print('Rowset ' . $i++ . "\n");
+	if ($handle1->columnCount() > 0)
+		print("Results detected\n");
+} while($handle1->nextRowset());
+
+$link->query("DROP TABLE bug61207");
+?>
+--EXPECT--
+Handle 1:
+Rowset 1
+Rowset 2
+Results detected
+Rowset 3
+Handle 2:
+Rowset 1
+Results detected
+Rowset 2
+Handle 3:
+Rowset 1
+Rowset 2
+Results detected
+Handle 4:
+Rowset 1
+Rowset 2
+Rowset 3
+Results detected


Property changes on: php/php-src/branches/PHP_5_4/ext/pdo_mysql/tests/bug_61207.phpt
___________________________________________________________________
Added: svn:keywords
   + Id Rev Revision
Added: svn:eol-style
   + native

Modified: php/php-src/trunk/ext/pdo_mysql/mysql_statement.c
===================================================================
--- php/php-src/trunk/ext/pdo_mysql/mysql_statement.c	2012-03-05 21:22:15 UTC (rev 323927)
+++ php/php-src/trunk/ext/pdo_mysql/mysql_statement.c	2012-03-05 23:38:15 UTC (rev 323928)
@@ -125,6 +125,39 @@
 }
 /* }}} */

+static int pdo_mysql_fill_stmt_from_result(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */
+{
+	pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data;
+	pdo_mysql_db_handle *H = S->H;
+	my_ulonglong row_count;
+	PDO_DBG_ENTER("pdo_mysql_fill_stmt_from_result");
+
+	row_count = mysql_affected_rows(H->server);
+	if (row_count == (my_ulonglong)-1) {
+		/* we either have a query that returned a result set or an error occured
+		   lets see if we have access to a result set */
+		if (!H->buffered) {
+			S->result = mysql_use_result(H->server);
+		} else {
+			S->result = mysql_store_result(H->server);
+		}
+		if (NULL == S->result) {
+			pdo_mysql_error_stmt(stmt);
+			PDO_DBG_RETURN(0);
+		}
+
+		stmt->row_count = (long) mysql_num_rows(S->result);
+		stmt->column_count = (int) mysql_num_fields(S->result);
+		S->fields = mysql_fetch_fields(S->result);
+	} else {
+		/* this was a DML or DDL query (INSERT, UPDATE, DELETE, ... */
+		stmt->row_count = (long) row_count;
+	}
+
+	PDO_DBG_RETURN(1);
+}
+/* }}} */
+
 #ifndef PDO_USE_MYSQLND
 static int pdo_mysql_stmt_execute_prepared_libmysql(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */
 {
@@ -302,30 +335,7 @@
 		PDO_DBG_RETURN(0);
 	}

-	row_count = mysql_affected_rows(H->server);
-	if (row_count == (my_ulonglong)-1) {
-		/* we either have a query that returned a result set or an error occured
-		   lets see if we have access to a result set */
-		if (!H->buffered) {
-			S->result = mysql_use_result(H->server);
-		} else {
-			S->result = mysql_store_result(H->server);
-		}
-		if (NULL == S->result) {
-			pdo_mysql_error_stmt(stmt);
-			PDO_DBG_RETURN(0);
-		}
-
-		stmt->row_count = (long) mysql_num_rows(S->result);
-		stmt->column_count = (int) mysql_num_fields(S->result);
-		S->fields = mysql_fetch_fields(S->result);
-
-	} else {
-		/* this was a DML or DDL query (INSERT, UPDATE, DELETE, ... */
-		stmt->row_count = (long) row_count;
-	}
-
-	PDO_DBG_RETURN(1);
+	PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt TSRMLS_CC));
 }
 /* }}} */

@@ -412,25 +422,7 @@
 		/* No more results */
 		PDO_DBG_RETURN(0);
 	} else {
-		if (!H->buffered) {
-			S->result = mysql_use_result(H->server);
-			row_count = 0;
-		} else {
-			S->result = mysql_store_result(H->server);
-			if ((long)-1 == (row_count = (long) mysql_affected_rows(H->server))) {
-				pdo_mysql_error_stmt(stmt);
-				PDO_DBG_RETURN(0);
-			}
-		}
-
-		if (NULL == S->result) {
-			PDO_DBG_RETURN(0);
-		}
-
-		stmt->row_count = row_count;
-		stmt->column_count = (int) mysql_num_fields(S->result);
-		S->fields = mysql_fetch_fields(S->result);
-		PDO_DBG_RETURN(1);
+		PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt TSRMLS_CC));
 	}
 }
 /* }}} */

Added: php/php-src/trunk/ext/pdo_mysql/tests/bug_61207.phpt
===================================================================
--- php/php-src/trunk/ext/pdo_mysql/tests/bug_61207.phpt	                        (rev 0)
+++ php/php-src/trunk/ext/pdo_mysql/tests/bug_61207.phpt	2012-03-05 23:38:15 UTC (rev 323928)
@@ -0,0 +1,103 @@
+--TEST--
+PDO MySQL Bug #61207 (PDO::nextRowset() after a multi-statement query doesn't always work)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_mysql')) die('skip not loaded');
+require dirname(__FILE__) . '/config.inc';
+require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
+PDOTest::skip();
+?>
+--FILE--
+<?php
+require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
+
+$link = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt');
+
+$link->query('create table `bug61207`( `id` int )');
+
+$handle1 = $link->prepare('insert into bug61207(id) values(1);
+                          select * from bug61207 where id = ?;
+                          update bug61207 set id = 2 where id = ?;');
+
+$handle1->bindValue('1', '1');
+$handle1->bindValue('2', '1');
+
+$handle1->execute();
+$i = 1;
+print("Handle 1:\n");
+do {
+	print('Rowset ' . $i++ . "\n");
+	if ($handle1->columnCount() > 0)
+		print("Results detected\n");
+} while($handle1->nextRowset());
+
+$handle2 = $link->prepare('select * from bug61207 where id = ?;
+                           update bug61207 set id = 1 where id = ?;');
+
+$handle2->bindValue('1', '2');
+$handle2->bindValue('2', '2');
+
+$handle2->execute();
+
+$i = 1;
+print("Handle 2:\n");
+do {
+	print('Rowset ' . $i++ . "\n");
+	if ($handle2->columnCount() > 0)
+		print("Results detected\n");
+} while($handle2->nextRowset());
+
+$handle3 = $link->prepare('update bug61207 set id = 2 where id = ?;
+                           select * from bug61207 where id = ?;');
+
+$handle3->bindValue('1', '1');
+$handle3->bindValue('2', '2');
+
+$handle3->execute();
+
+$i = 1;
+print("Handle 3:\n");
+do {
+	print('Rowset ' . $i++ . "\n");
+	if ($handle3->columnCount() > 0)
+		print("Results detected\n");
+} while($handle3->nextRowset());
+
+$handle4 = $link->prepare('insert into bug61207(id) values(3);
+                           update bug61207 set id = 2 where id = ?;
+                           select * from bug61207 where id = ?;');
+
+$handle4->bindValue('1', '3');
+$handle4->bindValue('2', '2');
+
+$handle4->execute();
+
+$i = 1;
+print("Handle 4:\n");
+do {
+	print('Rowset ' . $i++ . "\n");
+	if ($handle1->columnCount() > 0)
+		print("Results detected\n");
+} while($handle1->nextRowset());
+
+$link->query("DROP TABLE bug61207");
+?>
+--EXPECT--
+Handle 1:
+Rowset 1
+Rowset 2
+Results detected
+Rowset 3
+Handle 2:
+Rowset 1
+Results detected
+Rowset 2
+Handle 3:
+Rowset 1
+Rowset 2
+Results detected
+Handle 4:
+Rowset 1
+Rowset 2
+Rowset 3
+Results detected


Property changes on: php/php-src/trunk/ext/pdo_mysql/tests/bug_61207.phpt
___________________________________________________________________
Added: svn:keywords
   + Id Rev Revision
Added: svn:eol-style
   + native
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to