Bug #63185 [Ver->Csd]: nextRowset() ignores MySQL errors with native prepared statements

From: Date: Tue, 08 Dec 2020 10:36:35 +0000
Subject: Bug #63185 [Ver->Csd]: nextRowset() ignores MySQL errors with native prepared statements
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-230930@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=63185&edit=1

 ID:                 63185
 Updated by:         nikic@php.net
 Reported by:        dexen dot devries at gmail dot com
 Summary:            nextRowset() ignores MySQL errors with native
                     prepared statements
-Status:             Verified
+Status:             Closed
 Type:               Bug
 Package:            PDO MySQL
 Operating System:   linux
 PHP Version:        5.4.7
 Block user comment: N
 Private report:     N

 New Comment:

Automatic comment on behalf of nikita.ppv@gmail.com
Revision: http://git.php.net/?p=php-src.git;a=commit;h=bd093ad8615267ae4ff1a237e6285dc182a9ff57
Log: Fixed bug #63185


Previous Comments:
------------------------------------------------------------------------
[2020-12-08 09:41:00] nikic@php.net

Looks like just reporting the error from next_result() doesn't cut, because the preceding
more_results() call already returns false in this case.

------------------------------------------------------------------------
[2020-12-08 09:21:28] nikic@php.net

I think for emulated prepares this was fixed in https://github.com/php/php-src/commit/0737be7e7baf1fece1683ca9f33064733d8b3514,
but for native prepared statements I can reproduce this on current master.

------------------------------------------------------------------------
[2013-11-22 14:48:39] dexen dot devries at gmail dot com

Another take on the bug, with a testcase: http://www.yiiframework.com/forum/index.php/topic/39970-transaction-and-multiple-queries/

------------------------------------------------------------------------
[2012-10-25 10:56:11] dexen dot devries at gmali dot com

To simplify OP: MySQL PDO with mysqlnd' and with PDO::ATTR_EMULATE_PREPARES set to
false' triggers this bug -- errors returned along 2nd or later rowsets  are ignored. For
example, when calling an SQL stored procedure which contains several SELECT statements, and thus
returns multiple rowsets.

Relevant C fragment, file ext/pdo_mysql/mysql_statement.c:

static int pdo_mysql_stmt_next_rowset(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */
{
(...)
#if PDO_USE_MYSQLND
	if (!H->emulate_prepare) {
		if (!mysqlnd_stmt_more_results(S->stmt)) {
			PDO_DBG_RETURN(0);
		}
		if (mysqlnd_stmt_next_result(S->stmt)) {
			/*** here error goes unnoticed ***/
			PDO_DBG_RETURN(0);
		}

Trivial patch attached.

------------------------------------------------------------------------
[2012-09-29 11:34:05] dexen dot devries at gmali dot com

Was tested on PHP 5.4.7 (stock for Slackware 14.0), with mysqlnd driver for PDO (Client API version:
mysqlnd 5.0.10 - 20111026 - $Id: b0b3b15c693b7f6aeb3aa66b646fee339f175e39)

------------------------------------------------------------------------


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    https://bugs.php.net/bug.php?id=63185


--
Edit this bug report at https://bugs.php.net/bug.php?id=63185&edit=1


Thread (8 messages)

« previous php.bugs (#230930) next »