Annotation of embedaddon/php/ext/oci8/tests/bug43497_92.phpt, revision 1.1.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>