ZF-5663: Statement doesn't get deallocated after preparation and execution



In a relatively large transaction using Zend_Db_Adapter_Pdo_Pgsql the PostgreSQL Database suddenly (and somewhat randomly) terminates this transaction with the error:

{{ERROR: 42P05: prepared statement "pdo_pgsql_stmt_0a0d3ba8" already exists}}

Based on a quick look at "prepare.c" (in the PostgreSQL source code), the presence of the prepared statement is checked by its name and not its post-parse-analysis tree. I assume the name is set by PDO and is in this special case "pdo_pgsql_stmt_0a0d3ba8". Please correct me if I'm wrong.

I think the problem relies in Zend/Db/Adapter/Abstract.php, e.g.

        $stmt = $this->query($sql, $bind);
        $result = $stmt->fetchAll($fetchMode);
        return $result;

Here this $stmt is not cleared after execution and in the case of a large transaction the statement relies in a prepared state in the database. I think this sometimes gets garbage collected by php, but as it seems not at the right time. In a method like "fetchAll(...)" or "fetchOne(...)" or similar "one-shot" methods, this statement can't be reused. In this case a prepared statement doesn't make sense, but this is discussed in another report already.

Isn't it a bad idea not to close a resource which isn't reused later in the code?

Either I'm totally wrong and royally fucked up my database or this is really a problem with Zend_Db_Adapter_Pdo_Pgsql and/or PDO. But I think not closing a resource which is not used in the later process is bad practice and should be fixed.

Could someone shed a little more light on this? This would be great :)

PostgreSQL Version:

SELECT version();
 PostgreSQL 8.3.5 on i486-pc-linux-gnu, compiled by GCC gcc-4.3.real (Debian 4.3.2-1) 4.3.2
(1 row)

Please tell me if you need more information about this problem (exact statements, php version, phpinfo() ...). Thx.


Bulk change of all issues last updated before 1st January 2010 as "Won't Fix".

Feel free to re-open and provide a patch if you want to fix this issue.