|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2006-06-21 07:52 UTC] sagi at adamnet dot co dot il
Description:
------------
Using PHP 5.1.4 to connect to a postgresql 8.1.4 database, native prepared statements.
When allocating a prepared statement and then trying to unset it, PDO attemps to deallocate it even if it never been used (eg. when running a query against an empty set).
PDO does not throw an exception in such case, but an error such as:
ERROR: prepared statement "pdo_pgsql_stmt_085b2f2c" does not exist
Appers in the server log.
When running inside a transaction, such error aborts it.
Reproduce code:
---------------
$pdo->beginTransaction();
$stmt = $pdo->prepare("SELECT 'never executed'");
unset($stmt);
$res = $pdo->query('SELECT 123');
Actual result:
--------------
PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[25P02]: In failed sql transaction: 7 ERROR: current transaction is aborted, commands ignored until end of transaction block' in XXX:13
Stack trace:
#0 XXX: PDO->query('SELECT 123')
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Oct 27 05:00:01 2025 UTC |
Same with the latest CVS version: sagi@future:~/XXX/tmp$ /usr/local/php5-dev/bin/php -v PHP 5.2.0RC3-dev (cli) (built: Aug 20 2006 12:46:20) Copyright (c) 1997-2006 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2006 Zend Technologies sagi@future:~/XXX/tmp$ /usr/local/php5-dev/bin/php preptest.php PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[25P02]: In failed sql transaction: 7 ERROR: current transaction is aborted, commands ignored until end of transaction block' in /home/XXX/tmp/preptest.php:13 Stack trace: #0 /home/XXX/tmp/preptest.php(13): PDO->query('SELECT 123') #1 {main} thrown in /home/XXX/tmp/preptest.php on line 13 Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[25P02]: In failed sql transaction: 7 ERROR: current transaction is aborted, commands ignored until end of transaction block' in /home/XXX/tmp/preptest.php:13 Stack trace: #0 /home/XXX/tmp/preptest.php(13): PDO->query('SELECT 123') #1 {main} thrown in /home/XXX/tmp/preptest.php on line 13 sagi@future:~/XXX/tmp$I would suggest the following patch: --- pgsql_statement.c~ 2006-08-30 10:54:31.000000000 +0300 +++ pgsql_statement.c 2006-08-30 10:54:31.000000000 +0300 @@ -60,10 +60,13 @@ static int pgsql_stmt_dtor(pdo_stmt_t *s char *q = NULL; PGresult *res; - spprintf(&q, 0, "DEALLOCATE %s", S->stmt_name); - res = PQexec(H->server, q); - efree(q); - if (res) PQclear(res); + if (S->is_prepared) + { + spprintf(&q, 0, "DEALLOCATE %s", S->stmt_name); + res = PQexec(H->server, q); + efree(q); + if (res) PQclear(res); + } efree(S->stmt_name); S->stmt_name = NULL; }