Annotation of embedaddon/php/ext/oci8/tests/bug43497_92.phpt, revision 1.1
1.1 ! misho 1: --TEST--
! 2: Bug #43497 (OCI8 XML/getClobVal aka temporary LOBs leak UGA memory)
! 3: --SKIPIF--
! 4: <?php
! 5: $target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs
! 6: require(dirname(__FILE__).'/skipif.inc');
! 7: if (getenv('SKIP_SLOW_TESTS')) die('skip slow tests excluded by request');
! 8: if (preg_match('/Unknown/', oci_client_version()) != 1) {
! 9: die("skip expected output only valid with Oracle 9gR2 clients");
! 10: }
! 11: ?>
! 12: --FILE--
! 13: <?php
! 14:
! 15: require dirname(__FILE__).'/connect.inc';
! 16:
! 17: function sessionid($c) // determines and returns current session ID
! 18: {
! 19: $query = "select sid from v\$session where audsid = userenv('sessionid')";
! 20:
! 21: $stmt = oci_parse($c, $query);
! 22:
! 23: if (oci_execute($stmt, OCI_DEFAULT)) {
! 24: $row = oci_fetch($stmt);
! 25: return oci_result($stmt, 1);
! 26: }
! 27:
! 28: return null;
! 29: }
! 30:
! 31:
! 32: function templobs($c, $sid) // returns number of temporary LOBs
! 33: {
! 34: $query = "select abstract_lobs from v\$temporary_lobs where sid = " . $sid;
! 35:
! 36: $stmt = oci_parse($c, $query);
! 37:
! 38: if (oci_execute($stmt, OCI_DEFAULT)) {
! 39: $row = oci_fetch($stmt);
! 40: $val = oci_result($stmt, 1);
! 41: oci_free_statement($stmt);
! 42: return $val;
! 43: }
! 44: return null;
! 45: }
! 46:
! 47:
! 48: // Read all XML data using explicit LOB locator
! 49: function readxmltab_ex($c)
! 50: {
! 51: $stmt = oci_parse($c, "select extract(xml, '/').getclobval() from bug43497_tab");
! 52:
! 53: $cntchk = 0;
! 54: if (oci_execute($stmt)) {
! 55: while ($result = oci_fetch_array($stmt, OCI_NUM)) {
! 56: $result[0]->free(); // cleanup properly
! 57: ++$cntchk;
! 58: }
! 59: }
! 60: echo "Loop count check = $cntchk\n";
! 61: }
! 62:
! 63: // Read all XML data using explicit LOB locator but without freeing the temp lobs
! 64: function readxmltab_ex_nofree($c)
! 65: {
! 66: $stmt = oci_parse($c, "select extract(xml, '/').getclobval() from bug43497_tab");
! 67:
! 68: $cntchk = 0;
! 69: if (oci_execute($stmt)) {
! 70: while ($result = oci_fetch_array($stmt, OCI_NUM)) {
! 71: ++$cntchk;
! 72: }
! 73: }
! 74: echo "Loop count check = $cntchk\n";
! 75: }
! 76:
! 77: // Read all XML data using implicit LOB locator
! 78: function readxmltab_im($c)
! 79: {
! 80: $stmt = oci_parse($c, "select extract(xml, '/').getclobval() from bug43497_tab");
! 81:
! 82: $cntchk = 0;
! 83: if (oci_execute($stmt)) {
! 84: while ($result = oci_fetch_array($stmt, OCI_NUM+OCI_RETURN_LOBS)) {
! 85: ++$cntchk;
! 86: }
! 87: }
! 88: echo "Loop count check = $cntchk\n";
! 89: }
! 90:
! 91: function createxmltab($c) // create table w/ field of XML type
! 92: {
! 93: @dropxmltab($c);
! 94: $stmt = oci_parse($c, "create table bug43497_tab (id number primary key, xml xmltype)");
! 95: oci_execute($stmt);
! 96: }
! 97:
! 98: function dropxmltab($c) // delete table
! 99: {
! 100: $stmt = oci_parse($c, "drop table bug43497_tab");
! 101: oci_execute($stmt);
! 102: }
! 103:
! 104:
! 105: function fillxmltab($c)
! 106: {
! 107: for ($id = 1; $id <= 100; $id++) {
! 108:
! 109: // create an XML element string with random data
! 110: $s = "<data>";
! 111: for ($j = 0; $j < 128; $j++) {
! 112: $s .= rand();
! 113: }
! 114: $s .= "</data>\n";
! 115: for ($j = 0; $j < 4; $j++) {
! 116: $s .= $s;
! 117: }
! 118: $data = "<?xml version=\"1.0\"?><records>" . $s . "</records>";
! 119:
! 120: // insert XML data into database
! 121:
! 122: $stmt = oci_parse($c, "insert into bug43497_tab(id, xml) values (:id, sys.xmltype.createxml(:xml))");
! 123: oci_bind_by_name($stmt, ":id", $id);
! 124: $clob = oci_new_descriptor($c, OCI_D_LOB);
! 125: oci_bind_by_name($stmt, ":xml", $clob, -1, OCI_B_CLOB);
! 126: $clob->writetemporary($data);
! 127: oci_execute($stmt);
! 128:
! 129: $clob->close();
! 130: $clob->free();
! 131: }
! 132: }
! 133:
! 134:
! 135: // Initialize
! 136:
! 137: createxmltab($c);
! 138: fillxmltab($c);
! 139:
! 140: // Run Test
! 141:
! 142: $sid = sessionid($c);
! 143:
! 144: echo "Explicit LOB use\n";
! 145: for ($i = 1; $i <= 10; $i++) {
! 146: echo "\nRun = " . $i . "\n";
! 147: echo "Temporary LOBs = " . templobs($c, $sid) . "\n";
! 148: readxmltab_ex($c);
! 149: }
! 150:
! 151: echo "\nImplicit LOB use\n";
! 152: for ($i = 1; $i <= 10; $i++) {
! 153: echo "\nRun = " . $i . "\n";
! 154: echo "Temporary LOBs = " . templobs($c, $sid) . "\n";
! 155: readxmltab_im($c);
! 156: }
! 157:
! 158: echo "\nExplicit LOB with no free (i.e. a temp lob leak)\n";
! 159: for ($i = 1; $i <= 10; $i++) {
! 160: echo "\nRun = " . $i . "\n";
! 161: echo "Temporary LOBs = " . templobs($c, $sid) . "\n";
! 162: readxmltab_ex_nofree($c);
! 163: }
! 164:
! 165:
! 166:
! 167: // Cleanup
! 168:
! 169: dropxmltab($c);
! 170:
! 171: oci_close($c);
! 172:
! 173: echo "Done\n";
! 174: ?>
! 175: --EXPECT--
! 176: Explicit LOB use
! 177:
! 178: Run = 1
! 179: Temporary LOBs = 0
! 180: Loop count check = 100
! 181:
! 182: Run = 2
! 183: Temporary LOBs = 100
! 184: Loop count check = 100
! 185:
! 186: Run = 3
! 187: Temporary LOBs = 200
! 188: Loop count check = 100
! 189:
! 190: Run = 4
! 191: Temporary LOBs = 300
! 192: Loop count check = 100
! 193:
! 194: Run = 5
! 195: Temporary LOBs = 400
! 196: Loop count check = 100
! 197:
! 198: Run = 6
! 199: Temporary LOBs = 500
! 200: Loop count check = 100
! 201:
! 202: Run = 7
! 203: Temporary LOBs = 600
! 204: Loop count check = 100
! 205:
! 206: Run = 8
! 207: Temporary LOBs = 700
! 208: Loop count check = 100
! 209:
! 210: Run = 9
! 211: Temporary LOBs = 800
! 212: Loop count check = 100
! 213:
! 214: Run = 10
! 215: Temporary LOBs = 900
! 216: Loop count check = 100
! 217:
! 218: Implicit LOB use
! 219:
! 220: Run = 1
! 221: Temporary LOBs = 1000
! 222: Loop count check = 100
! 223:
! 224: Run = 2
! 225: Temporary LOBs = 1100
! 226: Loop count check = 100
! 227:
! 228: Run = 3
! 229: Temporary LOBs = 1200
! 230: Loop count check = 100
! 231:
! 232: Run = 4
! 233: Temporary LOBs = 1300
! 234: Loop count check = 100
! 235:
! 236: Run = 5
! 237: Temporary LOBs = 1400
! 238: Loop count check = 100
! 239:
! 240: Run = 6
! 241: Temporary LOBs = 1500
! 242: Loop count check = 100
! 243:
! 244: Run = 7
! 245: Temporary LOBs = 1600
! 246: Loop count check = 100
! 247:
! 248: Run = 8
! 249: Temporary LOBs = 1700
! 250: Loop count check = 100
! 251:
! 252: Run = 9
! 253: Temporary LOBs = 1800
! 254: Loop count check = 100
! 255:
! 256: Run = 10
! 257: Temporary LOBs = 1900
! 258: Loop count check = 100
! 259:
! 260: Explicit LOB with no free (i.e. a temp lob leak)
! 261:
! 262: Run = 1
! 263: Temporary LOBs = 2000
! 264: Loop count check = 100
! 265:
! 266: Run = 2
! 267: Temporary LOBs = 2100
! 268: Loop count check = 100
! 269:
! 270: Run = 3
! 271: Temporary LOBs = 2200
! 272: Loop count check = 100
! 273:
! 274: Run = 4
! 275: Temporary LOBs = 2300
! 276: Loop count check = 100
! 277:
! 278: Run = 5
! 279: Temporary LOBs = 2400
! 280: Loop count check = 100
! 281:
! 282: Run = 6
! 283: Temporary LOBs = 2500
! 284: Loop count check = 100
! 285:
! 286: Run = 7
! 287: Temporary LOBs = 2600
! 288: Loop count check = 100
! 289:
! 290: Run = 8
! 291: Temporary LOBs = 2700
! 292: Loop count check = 100
! 293:
! 294: Run = 9
! 295: Temporary LOBs = 2800
! 296: Loop count check = 100
! 297:
! 298: Run = 10
! 299: Temporary LOBs = 2900
! 300: Loop count check = 100
! 301: Done
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>