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

Reply via email to