mirror of
https://github.com/php/php-src.git
synced 2024-10-20 16:02:44 +00:00
188 lines
3.4 KiB
Plaintext
188 lines
3.4 KiB
Plaintext
|
--TEST--
|
||
|
Bug #42841 (REF CURSOR and oci_new_cursor PHP crash)
|
||
|
--SKIPIF--
|
||
|
<?php if (!extension_loaded('oci8')) die("skip no oci8 extension"); ?>
|
||
|
--INI--
|
||
|
oci8.statement_cache_size=20
|
||
|
--FILE--
|
||
|
<?php
|
||
|
|
||
|
require dirname(__FILE__).'/details.inc';
|
||
|
|
||
|
// note a oci_new_connect() occurs lower in the script
|
||
|
$c = oci_connect($user, $password, $dbase);
|
||
|
|
||
|
// Initialization
|
||
|
|
||
|
$stmtarray = array(
|
||
|
"create or replace procedure bug42841_proc(out_1 out sys_refcursor) is
|
||
|
begin
|
||
|
open out_1 for select 11 from dual union all select 12 from dual union all select 13 from dual;
|
||
|
end bug42841_proc;",
|
||
|
|
||
|
"create or replace package bug43449_pkg is
|
||
|
type cursortype is ref Cursor;
|
||
|
function testcursor return cursortype;
|
||
|
end bug43449_pkg;",
|
||
|
|
||
|
"create or replace package body bug43449_pkg is
|
||
|
function testcursor return cursortype is
|
||
|
retCursor cursorType;
|
||
|
begin
|
||
|
Open retCursor For 'select * from dual';
|
||
|
return retCursor;
|
||
|
end;
|
||
|
end bug43449_pkg;"
|
||
|
);
|
||
|
|
||
|
foreach ($stmtarray as $stmt) {
|
||
|
$s = oci_parse($c, $stmt);
|
||
|
@oci_execute($s);
|
||
|
}
|
||
|
|
||
|
// Main code
|
||
|
|
||
|
function do_bug42841($c)
|
||
|
{
|
||
|
echo "First attempt\n";
|
||
|
|
||
|
$sql = "BEGIN bug42841_proc(:cursor); END;";
|
||
|
$stmt = oci_parse($c, $sql);
|
||
|
$cursor = oci_new_cursor($c);
|
||
|
oci_bind_by_name($stmt, ":cursor", $cursor, -1, OCI_B_CURSOR);
|
||
|
|
||
|
oci_execute($stmt, OCI_DEFAULT);
|
||
|
oci_execute($cursor);
|
||
|
|
||
|
while($row = oci_fetch_array($cursor, OCI_ASSOC + OCI_RETURN_LOBS)) {
|
||
|
$data1[] = $row;
|
||
|
}
|
||
|
|
||
|
oci_free_statement($stmt);
|
||
|
oci_free_statement($cursor);
|
||
|
var_dump($data1);
|
||
|
|
||
|
echo "Second attempt\n";
|
||
|
|
||
|
$sql = "BEGIN bug42841_proc(:cursor); END;";
|
||
|
$stmt = oci_parse($c, $sql);
|
||
|
$cursor = oci_new_cursor($c);
|
||
|
oci_bind_by_name($stmt, ":cursor", $cursor, -1, OCI_B_CURSOR);
|
||
|
|
||
|
oci_execute($stmt, OCI_DEFAULT);
|
||
|
oci_execute($cursor);
|
||
|
|
||
|
while($row = oci_fetch_array($cursor, OCI_ASSOC + OCI_RETURN_LOBS)) {
|
||
|
$data2[] = $row;
|
||
|
}
|
||
|
|
||
|
oci_free_statement($stmt);
|
||
|
oci_free_statement($cursor);
|
||
|
var_dump($data2);
|
||
|
}
|
||
|
|
||
|
function do_bug43449($c)
|
||
|
{
|
||
|
|
||
|
for ($i = 0; $i < 2; $i++) {
|
||
|
var_dump(bug43449_getCur($c));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function bug43449_getCur($c)
|
||
|
{
|
||
|
$cur = oci_new_cursor($c);
|
||
|
$stmt = oci_parse($c, 'begin :cur := bug43449_pkg.testcursor; end;');
|
||
|
oci_bind_by_name($stmt, ':cur', $cur, -1, OCI_B_CURSOR);
|
||
|
oci_execute($stmt, OCI_DEFAULT);
|
||
|
oci_execute($cur, OCI_DEFAULT);
|
||
|
|
||
|
$ret = array();
|
||
|
|
||
|
while (ocifetchinto($cur, $row, OCI_ASSOC)) {
|
||
|
$ret[] = $row;
|
||
|
}
|
||
|
|
||
|
oci_free_statement($cur);
|
||
|
oci_free_statement($stmt);
|
||
|
return $ret;
|
||
|
}
|
||
|
|
||
|
echo "Test bug 42841: Procedure with OUT cursor parameter\n";
|
||
|
do_bug42841($c);
|
||
|
|
||
|
$c = oci_new_connect($user, $password, $dbase);
|
||
|
|
||
|
echo "Test bug 43449: Cursor as function result\n";
|
||
|
do_bug43449($c);
|
||
|
|
||
|
// Cleanup
|
||
|
|
||
|
$stmtarray = array(
|
||
|
"drop procedure bug42841_proc",
|
||
|
"drop package bug43449_pkg"
|
||
|
);
|
||
|
|
||
|
foreach ($stmtarray as $stmt) {
|
||
|
$s = oci_parse($c, $stmt);
|
||
|
oci_execute($s);
|
||
|
}
|
||
|
|
||
|
echo "Done\n";
|
||
|
|
||
|
?>
|
||
|
--EXPECT--
|
||
|
Test bug 42841: Procedure with OUT cursor parameter
|
||
|
First attempt
|
||
|
array(3) {
|
||
|
[0]=>
|
||
|
array(1) {
|
||
|
[11]=>
|
||
|
string(2) "11"
|
||
|
}
|
||
|
[1]=>
|
||
|
array(1) {
|
||
|
[11]=>
|
||
|
string(2) "12"
|
||
|
}
|
||
|
[2]=>
|
||
|
array(1) {
|
||
|
[11]=>
|
||
|
string(2) "13"
|
||
|
}
|
||
|
}
|
||
|
Second attempt
|
||
|
array(3) {
|
||
|
[0]=>
|
||
|
array(1) {
|
||
|
[11]=>
|
||
|
string(2) "11"
|
||
|
}
|
||
|
[1]=>
|
||
|
array(1) {
|
||
|
[11]=>
|
||
|
string(2) "12"
|
||
|
}
|
||
|
[2]=>
|
||
|
array(1) {
|
||
|
[11]=>
|
||
|
string(2) "13"
|
||
|
}
|
||
|
}
|
||
|
Test bug 43449: Cursor as function result
|
||
|
array(1) {
|
||
|
[0]=>
|
||
|
array(1) {
|
||
|
["DUMMY"]=>
|
||
|
string(1) "X"
|
||
|
}
|
||
|
}
|
||
|
array(1) {
|
||
|
[0]=>
|
||
|
array(1) {
|
||
|
["DUMMY"]=>
|
||
|
string(1) "X"
|
||
|
}
|
||
|
}
|
||
|
Done
|