#25869 [Opn->Csd]: Convert empty strings to NULL in DB::execute()
| From: | lsmith@php.net | Date: | Tue, 14 Oct 2003 18:00:26 +0000 |
| Subject: | #25869 [Opn->Csd]: Convert empty strings to NULL in DB::execute() | ||
| References: | 1 | Groups: | php.pear.dev |
| Request: | Send a blank email to pear-dev+get-22692@lists.php.net to get a copy of this message | ||
ID: 25869
Updated by: lsmith@php.net
-Summary: PostgreSQL Memory leaks with "prepare"d queries.
Reported By: chris at statgen dot ncsu dot edu
-Status: Open
+Status: Closed
Bug Type: PEAR related
Operating System: Windows XP
-PHP Version: 4.3.2
+PHP Version: 5.0.0b1 (beta1)
New Comment:
Thank you for your bug report. This issue has already been fixed
in the latest released version of PHP, which you can download at
http://www.php.net/downloads.php
this issue was closed in the 1.5.0RC1.
See here for details:
http://pear.php.net/package-changelog.php?package=DB&release=1.5.0RC1
Previous Comments:
------------------------------------------------------------------------
[2003-10-14 13:52:54] chris at statgen dot ncsu dot edu
Corrected spelling mistake in summary.
------------------------------------------------------------------------
[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