sixd Mon Feb 25 23:49:51 2008 UTC Added files: /php-src/ext/oci8/tests bug43492_2.phpt bug44008.phpt bug44206.phpt
Modified files: /php-src/ext/oci8 oci8_interface.c oci8_lob.c oci8_statement.c php_oci8_int.h /php-src/ext/oci8/tests lob_014.phpt lob_021.phpt Log: OCI8: fix bug #44008 (OCI-Lob->close) & bug #44206 (ref cursor leak)
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/oci8_interface.c?r1=1.35&r2=1.36&diff_format=u Index: php-src/ext/oci8/oci8_interface.c diff -u php-src/ext/oci8/oci8_interface.c:1.35 php-src/ext/oci8/oci8_interface.c:1.36 --- php-src/ext/oci8/oci8_interface.c:1.35 Tue Feb 19 01:44:29 2008 +++ php-src/ext/oci8/oci8_interface.c Mon Feb 25 23:49:51 2008 @@ -25,7 +25,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: oci8_interface.c,v 1.35 2008/02/19 01:44:29 sixd Exp $ */ +/* $Id: oci8_interface.c,v 1.36 2008/02/25 23:49:51 sixd Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -1548,11 +1548,12 @@ } PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement); - if (!statement->nested) { - /* nested cursors cannot be freed, they are allocated once and used during the fetch */ - zend_list_delete(statement->id); - } - + + zend_list_delete(statement->id); + if (statement->parent_stmtid) { + zend_list_delete(statement->parent_stmtid); + } + RETURN_TRUE; } /* }}} */ http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/oci8_lob.c?r1=1.33&r2=1.34&diff_format=u Index: php-src/ext/oci8/oci8_lob.c diff -u php-src/ext/oci8/oci8_lob.c:1.33 php-src/ext/oci8/oci8_lob.c:1.34 --- php-src/ext/oci8/oci8_lob.c:1.33 Thu Jan 24 14:08:45 2008 +++ php-src/ext/oci8/oci8_lob.c Mon Feb 25 23:49:51 2008 @@ -25,7 +25,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: oci8_lob.c,v 1.33 2008/01/24 14:08:45 rrichards Exp $ */ +/* $Id: oci8_lob.c,v 1.34 2008/02/25 23:49:51 sixd Exp $ */ @@ -88,6 +88,7 @@ descriptor->buffering = PHP_OCI_LOB_BUFFER_DISABLED; /* buffering is off by default */ descriptor->charset_form = SQLCS_IMPLICIT; /* default value */ descriptor->charset_id = connection->charset; + descriptor->is_open = 0; if (descriptor->type == OCI_DTYPE_LOB || descriptor->type == OCI_DTYPE_FILE) { /* add Lobs & Files to hash. we'll flush them at the end */ @@ -576,7 +577,9 @@ { php_oci_connection *connection = descriptor->connection; - PHP_OCI_CALL_RETURN(connection->errcode, OCILobClose, (connection->svc, connection->err, descriptor->descriptor)); + if (descriptor->is_open) { + PHP_OCI_CALL_RETURN(connection->errcode, OCILobClose, (connection->svc, connection->err, descriptor->descriptor)); + } if (connection->errcode != OCI_SUCCESS) { php_oci_error(connection->err, connection->errcode TSRMLS_CC); @@ -914,6 +917,8 @@ return 1; } + descriptor->is_open = 1; + return php_oci_lob_write(descriptor, 0, data, data_len, &bytes_written TSRMLS_CC); } /* }}} */ http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/oci8_statement.c?r1=1.53&r2=1.54&diff_format=u Index: php-src/ext/oci8/oci8_statement.c diff -u php-src/ext/oci8/oci8_statement.c:1.53 php-src/ext/oci8/oci8_statement.c:1.54 --- php-src/ext/oci8/oci8_statement.c:1.53 Tue Feb 19 01:44:29 2008 +++ php-src/ext/oci8/oci8_statement.c Mon Feb 25 23:49:51 2008 @@ -25,7 +25,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: oci8_statement.c,v 1.53 2008/02/19 01:44:29 sixd Exp $ */ +/* $Id: oci8_statement.c,v 1.54 2008/02/25 23:49:51 sixd Exp $ */ #ifdef HAVE_CONFIG_H @@ -108,7 +108,7 @@ statement->connection = connection; statement->has_data = 0; - statement->nested = 0; + statement->parent_stmtid = 0; zend_list_addref(statement->connection->rsrc_id); if (OCI_G(default_prefetch) > 0) { @@ -344,6 +344,7 @@ if (!nested_stmt) { return OCI_ERROR; } + nested_stmt->parent_stmtid = outcol->statement->id; zend_list_addref(outcol->statement->id); outcol->nested_statement = nested_stmt; outcol->stmtid = nested_stmt->id; http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/php_oci8_int.h?r1=1.40&r2=1.41&diff_format=u Index: php-src/ext/oci8/php_oci8_int.h diff -u php-src/ext/oci8/php_oci8_int.h:1.40 php-src/ext/oci8/php_oci8_int.h:1.41 --- php-src/ext/oci8/php_oci8_int.h:1.40 Tue Feb 19 01:44:29 2008 +++ php-src/ext/oci8/php_oci8_int.h Mon Feb 25 23:49:51 2008 @@ -25,7 +25,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_oci8_int.h,v 1.40 2008/02/19 01:44:29 sixd Exp $ */ +/* $Id: php_oci8_int.h,v 1.41 2008/02/25 23:49:51 sixd Exp $ */ #if HAVE_OCI8 # ifndef PHP_OCI8_INT_H @@ -150,6 +150,7 @@ ub4 chunk_size; /* chunk size of the LOB. 0 - unknown */ ub1 charset_form; /* charset form, required for NCLOBs */ ub2 charset_id; /* charset ID */ + unsigned is_open:1; /* helps to determine if lob is open or not */ php_oci_lob_type lob_type; /* CLOB/BLOB */ } php_oci_descriptor; /* }}} */ @@ -180,6 +181,7 @@ typedef struct { /* php_oci_statement {{{ */ int id; + int parent_stmtid; /* parent statement id */ php_oci_connection *connection; /* parent connection handle */ sword errcode; /* last errcode*/ OCIError *err; /* private error handle */ @@ -192,7 +194,6 @@ int ncolumns; /* number of columns in the result */ unsigned executed:1; /* statement executed flag */ unsigned has_data:1; /* statement has more data flag */ - unsigned nested:1; /* statement handle is valid */ ub2 stmttype; /* statement type */ } php_oci_statement; /* }}} */ http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/lob_014.phpt?r1=1.4&r2=1.5&diff_format=u Index: php-src/ext/oci8/tests/lob_014.phpt diff -u php-src/ext/oci8/tests/lob_014.phpt:1.4 php-src/ext/oci8/tests/lob_014.phpt:1.5 --- php-src/ext/oci8/tests/lob_014.phpt:1.4 Fri Nov 10 16:56:19 2006 +++ php-src/ext/oci8/tests/lob_014.phpt Mon Feb 25 23:49:51 2008 @@ -43,9 +43,7 @@ ?> --EXPECTF-- int(4) - -Warning: OCI-Lob::close(): ORA-22289: cannot perform operation on an unopened file or LOB in %slob_014.php on line %d -bool(false) +bool(true) int(4) bool(true) http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/lob_021.phpt?r1=1.2&r2=1.3&diff_format=u Index: php-src/ext/oci8/tests/lob_021.phpt diff -u php-src/ext/oci8/tests/lob_021.phpt:1.2 php-src/ext/oci8/tests/lob_021.phpt:1.3 --- php-src/ext/oci8/tests/lob_021.phpt:1.2 Fri Nov 10 16:56:19 2006 +++ php-src/ext/oci8/tests/lob_021.phpt Mon Feb 25 23:49:51 2008 @@ -48,9 +48,7 @@ ?> --EXPECTF-- int(4) - -Warning: OCI-Lob::close(): ORA-22289: cannot perform operation on an unopened file or LOB in %s on line %d -bool(false) +bool(true) int(4) bool(true) http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/bug43492_2.phpt?view=markup&rev=1.1 Index: php-src/ext/oci8/tests/bug43492_2.phpt +++ php-src/ext/oci8/tests/bug43492_2.phpt --TEST-- Bug #43492 (Nested cursor leaks after related bug #44206 fixed) --SKIPIF-- <?php if (!extension_loaded('oci8')) die ("skip no oci8 extension"); ?> --FILE-- <?php // This test is similar to bug43492.phpt without the explict free. // Now that bug 44206 is fixed an automatic clean up will occur - // though it is still recommended in practice. require dirname(__FILE__).'/connect.inc'; $stmtarray = array( "DROP table bug43492_tab", "CREATE TABLE bug43492_tab(col1 VARCHAR2(1))", "INSERT INTO bug43492_tab VALUES ('A')", "INSERT INTO bug43492_tab VALUES ('B')", "INSERT INTO bug43492_tab VALUES ('C')", "INSERT INTO bug43492_tab VALUES ('D')", "INSERT INTO bug43492_tab VALUES ('E')", "INSERT INTO bug43492_tab VALUES ('F')", "INSERT INTO bug43492_tab VALUES ('G')", "INSERT INTO bug43492_tab VALUES ('H')", "INSERT INTO bug43492_tab VALUES ('I')", "INSERT INTO bug43492_tab VALUES ('J')" ); foreach ($stmtarray as $stmt) { $s = oci_parse($c, $stmt); @oci_execute($s); } function fetch($c, $i) { $s = ociparse($c, 'select cursor(select * from bug43492_tab) c from bug43492_tab'); ociexecute($s, OCI_DEFAULT); ocifetchinto($s, $result, OCI_ASSOC); ociexecute($result['C'], OCI_DEFAULT); return $result['C']; } for($i = 0; $i < 300; $i++) { $cur = fetch($c, $i); for($j = 0; $j < 10; $j++) { ocifetchinto($cur, $row, OCI_NUM); echo "$row[0] "; } echo "\n"; ocifreestatement($cur); } echo "Done\n"; // Cleanup $stmtarray = array( "DROP table bug43492_tab" ); foreach ($stmtarray as $stmt) { $s = oci_parse($c, $stmt); @oci_execute($s); } oci_close($c); ?> --EXPECT-- A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J Done http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/bug44008.phpt?view=markup&rev=1.1 Index: php-src/ext/oci8/tests/bug44008.phpt +++ php-src/ext/oci8/tests/bug44008.phpt --TEST-- Bug #44008 (Incorrect usage of OCI-Lob->close doesn't crash PHP) --SKIPIF-- <?php if (!extension_loaded('oci8')) die ("skip no oci8 extension"); ?> --FILE-- <?php require dirname(__FILE__).'/connect.inc'; // Initialization $stmtarray = array( "create or replace procedure bug44008_proc (p in out clob) as begin p := 'A'; end;" ); foreach ($stmtarray as $stmt) { $s = oci_parse($c, $stmt); @oci_execute($s); } // Run Test $s = oci_parse($c, 'begin bug44008_proc(:data); end;'); $textLob = oci_new_descriptor($c, OCI_D_LOB); oci_bind_by_name($s, ":data", $textLob, -1, OCI_B_CLOB); oci_execute($s, OCI_DEFAULT); $r = $textLob->load(); echo "$r\n"; // Incorrectly closing the lob doesn't cause a crash. // OCI-LOB->close() is documented for use only with OCI-Lob->writeTemporary() $textLob->close(); // Cleanup $stmtarray = array( "drop procedure bug44008_proc" ); foreach ($stmtarray as $stmt) { $s = oci_parse($c, $stmt); oci_execute($s); } oci_close($c); echo "Done\n"; ?> --EXPECT-- A Done http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/bug44206.phpt?view=markup&rev=1.1 Index: php-src/ext/oci8/tests/bug44206.phpt +++ php-src/ext/oci8/tests/bug44206.phpt --TEST-- Bug #44206 (Test if selecting ref cursors leads to ORA-1000 maximum open cursors reached) --SKIPIF-- <?php if (!extension_loaded('oci8')) die ("skip no oci8 extension"); ?> --FILE-- <?php require dirname(__FILE__).'/connect.inc'; // Run Test for ($x = 0; $x < 400; $x++) { $stmt = "select cursor (select $x from dual) a, cursor (select $x from dual) b from dual"; $s = oci_parse($c, $stmt); $r = oci_execute($s); if (!$r) { echo "Exiting $x\n"; exit; } $mode = OCI_ASSOC | OCI_RETURN_NULLS; $result = oci_fetch_array($s, $mode); oci_execute($result['A']); oci_execute($result['B']); oci_fetch_array($result['A'], $mode); oci_fetch_array($result['B'], $mode); oci_free_statement($result['A']); oci_free_statement($result['B']); oci_free_statement($s); } echo "Completed $x\n"; oci_close($c); echo "Done\n"; ?> --EXPECT-- Completed 400 Done
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php