#25869 [Opn]: PostgreSQL Memory leaks with "prepare"d queries.

From: Date: Tue, 14 Oct 2003 17:52:54 +0000
Subject: #25869 [Opn]: PostgreSQL Memory leaks with "prepare"d queries.
References: 1  Groups: php.pear.dev 
Request: Send a blank email to pear-dev+get-22691@lists.php.net to get a copy of this message
ID: 25869 User updated by: chris at statgen dot ncsu dot edu -Summary: PostgeSQL Memory leaks with "prepare"d queries. Reported By: chris at statgen dot ncsu dot edu Status: Open Bug Type: PEAR related Operating System: Windows XP PHP Version: 4.3.2 New Comment: Corrected spelling mistake in summary. Previous Comments: ------------------------------------------------------------------------ [2003-10-14 13:52:08] chris at statgen dot ncsu dot edu Description: ------------ Issues with freeing Prepared Queries ------------------------------------ Here are some issues with freeing prepared queries in the PostgreSQL implementation of DB. 1) If you use the query member in the form where you provide parameter values as a second argument the query is prepared and executed but the values produced by the prepare step are never freed. This leads to a considerable memory leaks if the query member is used repeatedly in a long-running process. Here's a suggested fix for this one. In DB_common::query, changes marked with "CSCS": function &query($query, $params = array()) { if (sizeof($params) > 0) { $sth = $this->prepare($query); if (DB::isError($sth)) { return $sth; } // CSCS Prepared query should be freed // CSCS return $this->execute($sth, $params); $res = &$this->execute($sth, $params); // CSCS $this->freeResult($sth); // CSCS return $res; // CSCS } else { 2) If you explicitly prepare a query there is no documented method defined for freeing the prepared version. This is (generally) a smaller memory leak since queries are usually prepared once and re-used often. 3) The freeResult member of DB_pgsql does not unset the query's entry in the prepared_queries array. The entries in the prepare_tokens and prepare_types arrays are freed. Suggested fix in DB_pgsql::freeResult is to add one line... unset($this->prepare_tokens[(int)$result]); unset($this->prepare_types[(int)$result]); unset($this->prepared_queries[(int)$result]); // CSCS 4) Not sure what effect this has but the prepare_tokens and prepare_types arrays are defined in both the base DB_common class and the DB_pgsql class. It seems like just having them in the DB_common class would be enough. Reproduce code: --------------- Let me know if you would like some reproduce code. ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=25869&edit=1

« previous php.pear.dev (#22691) next »