sixd Tue Dec 11 06:29:38 2007 UTC Modified files: /php-src/ext/oci8 oci8_statement.c /php-src/ext/oci8/tests lob_041.phpt bug42496_1.phpt Log: MFB: Fix #42496. Cursor leak fetching LOBs http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/oci8_statement.c?r1=1.50&r2=1.51&diff_format=u Index: php-src/ext/oci8/oci8_statement.c diff -u php-src/ext/oci8/oci8_statement.c:1.50 php-src/ext/oci8/oci8_statement.c:1.51 --- php-src/ext/oci8/oci8_statement.c:1.50 Thu Aug 2 19:04:21 2007 +++ php-src/ext/oci8/oci8_statement.c Tue Dec 11 06:29:38 2007 @@ -25,7 +25,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: oci8_statement.c,v 1.50 2007/08/02 19:04:21 sixd Exp $ */ +/* $Id: oci8_statement.c,v 1.51 2007/12/11 06:29:38 sixd Exp $ */ #ifdef HAVE_CONFIG_H @@ -376,7 +376,6 @@ if (!descr) { return OCI_ERROR; } - zend_list_addref(outcol->statement->id); outcol->descid = descr->id; descr->charset_form = outcol->charset_form; http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/lob_041.phpt?r1=1.1&r2=1.2&diff_format=u Index: php-src/ext/oci8/tests/lob_041.phpt diff -u /dev/null php-src/ext/oci8/tests/lob_041.phpt:1.2 --- /dev/null Tue Dec 11 06:29:38 2007 +++ php-src/ext/oci8/tests/lob_041.phpt Tue Dec 11 06:29:38 2007 @@ -0,0 +1,113 @@ +--TEST-- +Check LOBS are valid after statement free +--SKIPIF-- +<?php if (!extension_loaded('oci8')) die ("skip no oci8 extension"); ?> +--FILE-- +<?php + +require dirname(__FILE__).'/connect.inc'; + +// Initialization + +$stmtarray = array( + "DROP table lob_041_tab", + "CREATE table lob_041_tab(c1 CLOB)", + "INSERT INTO lob_041_tab VALUES('test data')" +); + +foreach ($stmtarray as $stmt) { + $s = oci_parse($c, $stmt); + @oci_execute($s); +} + +echo "Test 1 - explicit statement close\n"; + +$s = oci_parse($c, "SELECT C1 FROM lob_041_tab"); +$desc = oci_new_descriptor($c, OCI_DTYPE_LOB); +oci_define_by_name($s, "C1", $desc); +oci_execute($s); +$data = oci_fetch_assoc($s); +oci_free_statement($s); +echo $data['C1']->load(), "\n"; +oci_free_descriptor($desc); + +echo "\nTest 2 - implicit statement close\n"; + +$s = oci_parse($c, "SELECT C1 FROM lob_041_tab"); +$desc = oci_new_descriptor($c, OCI_DTYPE_LOB); +oci_define_by_name($s, "C1", $desc); +oci_execute($s); +$data = oci_fetch_assoc($s); +$s = null; +echo $data['C1']->load(), "\n"; +oci_free_descriptor($desc); +var_dump($desc); + +echo "\nTest 3 - no preallocated descriptor\n"; + +$s = oci_parse($c, "SELECT C1 FROM lob_041_tab"); +oci_execute($s); +$data = oci_fetch_assoc($s); +$s = null; +echo $data['C1']->load(), "\n"; +var_dump($data); + +// Cleanup + +echo "Done\n"; + +$stmtarray = array( + "DROP table lob_041_tab" +); + +foreach ($stmtarray as $stmt) { + $s = oci_parse($c, $stmt); + @oci_execute($s); +} + +oci_close($c); + +?> + +--EXPECTF-- +Test 1 - explicit statement close +test data + +Test 2 - implicit statement close +test data +object(OCI-Lob)#%d (1) { + ["descriptor"]=> + resource(%d) of type (oci8 descriptor) +} + +Test 3 - no preallocated descriptor +test data +array(1) { + ["C1"]=> + object(OCI-Lob)#%d (1) { + ["descriptor"]=> + resource(%d) of type (oci8 descriptor) + } +} +Done +--UEXPECTF-- +Test 1 - explicit statement close +test data + +Test 2 - implicit statement close +test data +object(OCI-Lob)#%d (1) { + [u"descriptor"]=> + resource(%d) of type (oci8 descriptor) +} + +Test 3 - no preallocated descriptor +test data +array(1) { + [u"C1"]=> + object(OCI-Lob)#%d (1) { + [u"descriptor"]=> + resource(%d) of type (oci8 descriptor) + } +} +Done http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/bug42496_1.phpt?r1=1.1&r2=1.2&diff_format=u Index: php-src/ext/oci8/tests/bug42496_1.phpt diff -u /dev/null php-src/ext/oci8/tests/bug42496_1.phpt:1.2 --- /dev/null Tue Dec 11 06:29:38 2007 +++ php-src/ext/oci8/tests/bug42496_1.phpt Tue Dec 11 06:29:38 2007 @@ -0,0 +1,61 @@ +--TEST-- +Bug #42496 (LOB fetch leaks cursors, eventually failing with ORA-1000 maximum open cursors reached) +--SKIPIF-- +<?php if (!extension_loaded('oci8')) die ("skip no oci8 extension"); ?> +--FILE-- +<?php + +require dirname(__FILE__).'/connect.inc'; + +// Initialization + +$stmtarray = array( + "DROP table bug42496_tab", + "CREATE table bug42496_tab(c1 CLOB, c2 CLOB)", + "INSERT INTO bug42496_tab VALUES('test1', 'test1')", + "INSERT INTO bug42496_tab VALUES('test2', 'test2')", + "INSERT INTO bug42496_tab VALUES('test3', 'test3')" +); + +foreach ($stmtarray as $stmt) { + $s = oci_parse($c, $stmt); + @oci_execute($s); +} + +// Run Test + +echo "Test 1\n"; + +for ($i = 0; $i < 15000; $i++) { + $s = oci_parse($c, "SELECT * from bug42496_tab"); + oci_define_by_name($s, "C1", $col1); + oci_define_by_name($s, "C2", $col2); + if (oci_execute($s)) { + $arr = array(); + while ($arr = oci_fetch_assoc($s)) { + $arr['C1']->free(); + $arr['C2']->free(); + } + } + oci_free_statement($s); +} + +echo "Done\n"; + +// Cleanup + +$stmtarray = array( + "DROP table bug42496_tab" +); + +foreach ($stmtarray as $stmt) { + $s = oci_parse($c, $stmt); + @oci_execute($s); +} + +oci_close($c); + +?> +--EXPECTF-- +Test 1 +Done
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php