From:             dexen dot devries at gmail dot com
Operating system: linux
PHP version:      5.4.7
Package:          PDO related
Bug Type:         Bug
Bug description:nextRowset() ignores MySQL errors

Description:
------------
An SQL stored procedure will return several rowsets when it contains
several SELECT statements. In MySQL CLI client (`mysql'), if any statement
raises SQL error, the procedure is aborted, HOWEVER, all rowsets prior to
the error  are displayed.


In PHP, PDO->nextRowset() switches to subsequent rowsets, or indicates no
more rowsets with `FALSE'. However, it ignores SQL errors in second and
later SQL statements.

For reproduction, the following SQL procedures refer to nonexistent table
`no_such_table'.

For reference SQL program for MySQL CLI client (`mysql') -- which correctly
indicates errors.
<<input>>:

DROP TABLE IF EXISTS test_table;
DROP TABLE IF EXISTS no_such_table;
DROP PROCEDURE IF EXISTS test_procedure_error_at_first;
DROP PROCEDURE IF EXISTS test_procedure_error_at_second;

CREATE TABLE test_table (aaa int PRIMARY KEY);
INSERT INTO test_table SELECT 1 UNION SELECT 2;

DELIMITER $$

CREATE PROCEDURE test_procedure_error_at_first ()
        BEGIN
                SELECT * FROM no_such_table; -- will raise error
                SELECT * FROM test_table;
        END;

CALL test_procedure_error_at_first $$

CREATE PROCEDURE test_procedure_error_at_second ()
        BEGIN
                SELECT * FROM test_table;
                SELECT * FROM no_such_table; -- will raise error
        END;

CALL test_procedure () $$

<<output for `test_procedure_error_at_first()'>>:
ERROR 1146 (42S02): Table 'no_such_table' doesn't exist

<<output for `test_procedure_error_at_second()'>>:
+-----+
| aaa |
+-----+
|   1 |
|   2 |
+-----+
2 rows in set (0.00 sec)

ERROR 1146 (42S02): Table 'no_such_table' doesn't exist


Test script:
---------------
<?php


$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$pdo->exec('DROP TABLE IF EXISTS test_table');
$pdo->exec('DROP TABLE IF EXISTS no_such_table');
$pdo->exec('DROP PROCEDURE IF EXISTS test_procedure_error_at_first');
$pdo->exec('DROP PROCEDURE IF EXISTS test_procedure_error_at_second');

$pdo->exec('CREATE TABLE test_table (aaa int PRIMARY KEY)');
$pdo->exec('INSERT INTO test_table SELECT 1 UNION SELECT 2');

$pdo->exec('CREATE PROCEDURE test_procedure_error_at_first ()
        BEGIN
                SELECT * FROM no_such_table; -- will raise error
                SELECT * FROM test_table;
        END');
$pdo->exec('CREATE PROCEDURE test_procedure_error_at_second ()
        BEGIN
                SELECT * FROM test_table;
                SELECT * FROM no_such_table; -- this SHOULD raise error, but 
will be
IGNORED
        END');

        # this would correctly indicate error raised by first SELECT * FROM
no_such_table by raising an PDOException
#$pdo->query('CALL test_procedure_error_at_first()');


$st = $pdo->query('CALL test_procedure_error_at_second()');

        # this correctly fetches data from first SELECT * FROM test_table
var_dump($st->fetchAll());

        # this IGNORES error raised by second SELECT * FROM no_such_table
var_dump($st->nextRowset());
var_dump($st->fetchAll());

Expected result:
----------------
array(2) { [0]=> array(2) { ["aaa"]=> int(1) [0]=> int(1) } [1]=> array(2)
{ ["aaa"]=> int(2) [0]=> int(2) } }     # from var_dump($st->fetchAll());

PDOException: Base table or view not found: 1146 Table 'no_such_table'
doesn't exist   # from $pdo->nextRowset()

Actual result:
--------------
array(2) { [0]=> array(2) { ["aaa"]=> int(1) [0]=> int(1) } [1]=> array(2)
{ ["aaa"]=> int(2) [0]=> int(2) } }     # from var_dump($st->fetchAll());
bool(false)     # from var_dump($st->nextRowset());
array(0) { }    # from var_dump($st->fetchAll());


-- 
Edit bug report at https://bugs.php.net/bug.php?id=63185&edit=1
-- 
Try a snapshot (PHP 5.4):   
https://bugs.php.net/fix.php?id=63185&r=trysnapshot54
Try a snapshot (PHP 5.3):   
https://bugs.php.net/fix.php?id=63185&r=trysnapshot53
Try a snapshot (trunk):     
https://bugs.php.net/fix.php?id=63185&r=trysnapshottrunk
Fixed in SVN:               https://bugs.php.net/fix.php?id=63185&r=fixed
Fixed in release:           https://bugs.php.net/fix.php?id=63185&r=alreadyfixed
Need backtrace:             https://bugs.php.net/fix.php?id=63185&r=needtrace
Need Reproduce Script:      https://bugs.php.net/fix.php?id=63185&r=needscript
Try newer version:          https://bugs.php.net/fix.php?id=63185&r=oldversion
Not developer issue:        https://bugs.php.net/fix.php?id=63185&r=support
Expected behavior:          https://bugs.php.net/fix.php?id=63185&r=notwrong
Not enough info:            
https://bugs.php.net/fix.php?id=63185&r=notenoughinfo
Submitted twice:            
https://bugs.php.net/fix.php?id=63185&r=submittedtwice
register_globals:           https://bugs.php.net/fix.php?id=63185&r=globals
PHP 4 support discontinued: https://bugs.php.net/fix.php?id=63185&r=php4
Daylight Savings:           https://bugs.php.net/fix.php?id=63185&r=dst
IIS Stability:              https://bugs.php.net/fix.php?id=63185&r=isapi
Install GNU Sed:            https://bugs.php.net/fix.php?id=63185&r=gnused
Floating point limitations: https://bugs.php.net/fix.php?id=63185&r=float
No Zend Extensions:         https://bugs.php.net/fix.php?id=63185&r=nozend
MySQL Configuration Error:  https://bugs.php.net/fix.php?id=63185&r=mysqlcfg

Reply via email to