123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 |
- --TEST--
- Bug #43497 (OCI8 XML/getClobVal aka temporary LOBs leak UGA memory)
- --EXTENSIONS--
- oci8
- --SKIPIF--
- <?php
- $target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs
- require(__DIR__.'/skipif.inc');
- if (getenv('SKIP_SLOW_TESTS')) die('skip slow tests excluded by request');
- ?>
- --FILE--
- <?php
- require __DIR__.'/connect.inc';
- function sessionid($c) // determines and returns current session ID
- {
- $query = "select sid from v\$session where audsid = userenv('sessionid')";
- $stmt = oci_parse($c, $query);
- if (oci_execute($stmt, OCI_DEFAULT)) {
- $row = oci_fetch($stmt);
- return oci_result($stmt, 1);
- }
- return null;
- }
- function templobs($c, $sid) // returns number of temporary LOBs
- {
- $query = "select abstract_lobs from v\$temporary_lobs where sid = " . $sid;
- $stmt = oci_parse($c, $query);
- if (oci_execute($stmt, OCI_DEFAULT)) {
- $row = oci_fetch($stmt);
- $val = oci_result($stmt, 1);
- oci_free_statement($stmt);
- return $val;
- }
- return null;
- }
- // Read all XML data using explicit LOB locator
- function readxmltab_ex($c)
- {
- $stmt = oci_parse($c, "select extract(xml, '/').getclobval() from bug43497_tab");
- $cntchk = 0;
- if (oci_execute($stmt)) {
- while ($result = oci_fetch_array($stmt, OCI_NUM)) {
- $result[0]->free(); // cleanup properly
- ++$cntchk;
- }
- }
- echo "Loop count check = $cntchk\n";
- }
- // Read all XML data using explicit LOB locator but without freeing the temp lobs
- function readxmltab_ex_nofree($c)
- {
- $stmt = oci_parse($c, "select extract(xml, '/').getclobval() from bug43497_tab");
- $cntchk = 0;
- if (oci_execute($stmt)) {
- while ($result = oci_fetch_array($stmt, OCI_NUM)) {
- ++$cntchk;
- }
- }
- echo "Loop count check = $cntchk\n";
- }
- // Read all XML data using implicit LOB locator
- function readxmltab_im($c)
- {
- $stmt = oci_parse($c, "select extract(xml, '/').getclobval() from bug43497_tab");
- $cntchk = 0;
- if (oci_execute($stmt)) {
- while ($result = oci_fetch_array($stmt, OCI_NUM+OCI_RETURN_LOBS)) {
- ++$cntchk;
- }
- }
- echo "Loop count check = $cntchk\n";
- }
- function createxmltab($c) // create table w/ field of XML type
- {
- @dropxmltab($c);
- $stmt = oci_parse($c, "create table bug43497_tab (id number primary key, xml xmltype)");
- oci_execute($stmt);
- }
- function dropxmltab($c) // delete table
- {
- $stmt = oci_parse($c, "drop table bug43497_tab");
- oci_execute($stmt);
- }
- function fillxmltab($c)
- {
- for ($id = 1; $id <= 100; $id++) {
- // create an XML element string with random data
- $s = "<data>";
- for ($j = 0; $j < 128; $j++) {
- $s .= rand();
- }
- $s .= "</data>\n";
- for ($j = 0; $j < 4; $j++) {
- $s .= $s;
- }
- $data = "<?xml version=\"1.0\"?><records>" . $s . "</records>";
- // insert XML data into database
- $stmt = oci_parse($c, "insert into bug43497_tab(id, xml) values (:id, sys.xmltype.createxml(:xml))");
- oci_bind_by_name($stmt, ":id", $id);
- $clob = oci_new_descriptor($c, OCI_D_LOB);
- oci_bind_by_name($stmt, ":xml", $clob, -1, OCI_B_CLOB);
- $clob->writeTemporary($data);
- oci_execute($stmt);
- $clob->close();
- $clob->free();
- }
- }
- // Initialize
- createxmltab($c);
- fillxmltab($c);
- // Run Test
- $sid = sessionid($c);
- echo "Explicit LOB use\n";
- for ($i = 1; $i <= 10; $i++) {
- echo "\nRun = " . $i . "\n";
- echo "Temporary LOBs = " . templobs($c, $sid) . "\n";
- readxmltab_ex($c);
- }
- echo "\nImplicit LOB use\n";
- for ($i = 1; $i <= 10; $i++) {
- echo "\nRun = " . $i . "\n";
- echo "Temporary LOBs = " . templobs($c, $sid) . "\n";
- readxmltab_im($c);
- }
- echo "\nExplicit LOB with no free\n";
- for ($i = 1; $i <= 10; $i++) {
- echo "\nRun = " . $i . "\n";
- echo "Temporary LOBs = " . templobs($c, $sid) . "\n";
- readxmltab_ex_nofree($c);
- }
- // Cleanup
- dropxmltab($c);
- oci_close($c);
- echo "Done\n";
- ?>
- --EXPECT--
- Explicit LOB use
- Run = 1
- Temporary LOBs = 0
- Loop count check = 100
- Run = 2
- Temporary LOBs = 0
- Loop count check = 100
- Run = 3
- Temporary LOBs = 0
- Loop count check = 100
- Run = 4
- Temporary LOBs = 0
- Loop count check = 100
- Run = 5
- Temporary LOBs = 0
- Loop count check = 100
- Run = 6
- Temporary LOBs = 0
- Loop count check = 100
- Run = 7
- Temporary LOBs = 0
- Loop count check = 100
- Run = 8
- Temporary LOBs = 0
- Loop count check = 100
- Run = 9
- Temporary LOBs = 0
- Loop count check = 100
- Run = 10
- Temporary LOBs = 0
- Loop count check = 100
- Implicit LOB use
- Run = 1
- Temporary LOBs = 0
- Loop count check = 100
- Run = 2
- Temporary LOBs = 0
- Loop count check = 100
- Run = 3
- Temporary LOBs = 0
- Loop count check = 100
- Run = 4
- Temporary LOBs = 0
- Loop count check = 100
- Run = 5
- Temporary LOBs = 0
- Loop count check = 100
- Run = 6
- Temporary LOBs = 0
- Loop count check = 100
- Run = 7
- Temporary LOBs = 0
- Loop count check = 100
- Run = 8
- Temporary LOBs = 0
- Loop count check = 100
- Run = 9
- Temporary LOBs = 0
- Loop count check = 100
- Run = 10
- Temporary LOBs = 0
- Loop count check = 100
- Explicit LOB with no free
- Run = 1
- Temporary LOBs = 0
- Loop count check = 100
- Run = 2
- Temporary LOBs = 0
- Loop count check = 100
- Run = 3
- Temporary LOBs = 0
- Loop count check = 100
- Run = 4
- Temporary LOBs = 0
- Loop count check = 100
- Run = 5
- Temporary LOBs = 0
- Loop count check = 100
- Run = 6
- Temporary LOBs = 0
- Loop count check = 100
- Run = 7
- Temporary LOBs = 0
- Loop count check = 100
- Run = 8
- Temporary LOBs = 0
- Loop count check = 100
- Run = 9
- Temporary LOBs = 0
- Loop count check = 100
- Run = 10
- Temporary LOBs = 0
- Loop count check = 100
- Done
|