Actually, the more I think about it, this would result in an
inadvertent API change. Right now, if you have a SQL syntax error, the
error would be thrown by ->execute(). But with this change, the error
would be thrown by ->prepare(). So code that currently wraps execute()
but not prepare() with a try{}catch(){} would start failing.

Is this a show stopper? Or is restoring the "proper" execution path worth it?

>From what I can see in the few open source drivers I looked at, it
won't be an issue (Drupal, Doctrine, Zend, Lithium, etc)...

Thanks,

Anthony

On Thu, Jun 21, 2012 at 10:19 PM, Anthony Ferrara <ircmax...@gmail.com> wrote:
> As it turns out, the testing of this is far more difficult than I
> originally suspected. Not because it fails, but because emulated
> queries were behaving badly to begin with, so a number of tests were
> testing bad behavior. For example, bug 44327:
>
> https://github.com/ircmaxell/php-src/blob/master/ext/pdo_mysql/tests/bug44327.phpt
>
> It runs the following code:
>
>        $stmt = $db->prepare('foo');
>        @$stmt->execute();
>        $row = $stmt->fetch();
>        var_dump($row->queryString);
>
> And expects:
>
> Notice: Trying to get property of non-object in %s on line %d
> NULL
>
> Whereas the proper behavior is for the syntax error to be thrown from
> `prepare`. PDO emulation doesn't do that, because it doesn't parse
> until `execute`, hence the error delays until that point.
>
> When I run it, I get:
>
> Warning: PDO::prepare(): SQLSTATE[42000]: Syntax error or access
> violation: 1064 You have an error in your SQL syntax; check the manual
> that corresponds to your MySQL server version for the right syntax to
> use near 'foo' at line 1 in %s on line %d
>
> Because it's sent back at prepare() instead of at execute (and prepare
> doesn't have an @).
>
> There are at least a few more failures of this nature.
>
> To fix this, is going to take some significant refactoring of a number
> of tests. Plus, without this patch, I'm still getting 2 warnings and 6
> failures:
>
> =====================================================================
> Number of tests :  166               157
> Tests skipped   :    9 (  5.4%) --------
> Tests warned    :    2 (  1.2%) (  1.3%)
> Tests failed    :    6 (  3.6%) (  3.8%)
> Expected fail   :    1 (  0.6%) (  0.6%)
> Tests passed    :  148 ( 89.2%) ( 94.3%)
> ---------------------------------------------------------------------
> Time taken      :   43 seconds
> =====================================================================
>
> =====================================================================
> EXPECTED FAILED TEST SUMMARY
> ---------------------------------------------------------------------
> PECL Bug #7976 (Calling stored procedure several times)
> [ext/pdo_mysql/tests/bug_pecl_7976.phpt]  XFAIL REASON: Works with
> mysqlnd. It is not supported by libmysql. For libmysql is good enough
> to see no crash.
> =====================================================================
>
> =====================================================================
> FAILED TEST SUMMARY
> ---------------------------------------------------------------------
> Bug #39858 (Lost connection to MySQL server during query by a repeated
> call stored proced) [ext/pdo_mysql/tests/bug_39858.phpt]
> PDO MySQL Bug #41997 (stored procedure call returning single rowset
> blocks future queries) [ext/pdo_mysql/tests/bug_41997.phpt]
> MySQL PDO->__construct() - Generic + DSN
> [ext/pdo_mysql/tests/pdo_mysql___construct.phpt]
> MySQL PDO->exec(), affected rows
> [ext/pdo_mysql/tests/pdo_mysql_exec_load_data.phpt]
> MySQL PDOStatement->nextRowSet()
> [ext/pdo_mysql/tests/pdo_mysql_stmt_nextrowset.phpt]
> MySQL Prepared Statements and different column counts
> [ext/pdo_mysql/tests/pdo_mysql_stmt_variable_columncount.phpt]
> =====================================================================
>
> =====================================================================
> WARNED TEST SUMMARY
> ---------------------------------------------------------------------
> Bug #44454 (Unexpected exception thrown in foreach() statement)
> [ext/pdo_mysql/tests/bug_44454.phpt] (warn: XFAIL section but test
> passes)
> MySQL PDO->prepare(), emulated PS
> [ext/pdo_mysql/tests/pdo_mysql_prepare_emulated.phpt] (warn: XFAIL
> section but test passes)
> =====================================================================
>
> Whereas with the patch, there are a few more failures:
>
> =====================================================================
> Number of tests :  166               157
> Tests skipped   :    9 (  5.4%) --------
> Tests warned    :    2 (  1.2%) (  1.3%)
> Tests failed    :   18 ( 10.8%) ( 11.5%)
> Expected fail   :    1 (  0.6%) (  0.6%)
> Tests passed    :  136 ( 81.9%) ( 86.6%)
> ---------------------------------------------------------------------
> Time taken      :   53 seconds
> =====================================================================
>
>
> So to do this, I'd need to fix those as well... (at least all but the XFAIL)
>
> So I'm going to keep at it, but it's going to take a while (and would
> like some insight into if this is the best approach to fixing the
> tests)...
>
> Thanks,
>
> Anthony
>
> On Thu, Jun 21, 2012 at 2:57 AM, Ulf Wendel <ulf.wen...@phpdoc.de> wrote:
>> Am 20.06.2012 08:39, schrieb Pierre Joye:
>>
>>> hi Chris,
>>>
>>> On Tue, Jun 19, 2012 at 11:45 PM, Christopher Jones
>>> <christopher.jo...@oracle.com>  wrote:
>>>
>>>> We should take this offline - I can see cases where I'd strongly
>>>> disagree.
>>>
>>>
>>> I see no reason to move a discussion offline or off list, this is a
>>> topic that interests many other readers or developers.
>>
>>
>> Agreed. There was enough trouble around PDO and discussions going on in the
>> hidden.
>>
>> However, this does not impact the original topic.
>>
>> Ulf
>>
>>
>> --
>> PHP Internals - PHP Runtime Development Mailing List
>> To unsubscribe, visit: http://www.php.net/unsub.php
>>

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to