/home/lnzliplg/www/alt-php85-pecl-pdo_oci_1.2.0-1.el8.zip
PK�C�\L�Crr$tests/pdo_oci_attr_call_timeout.phptnu�[���--TEST--
PDO_OCI: Attribute: Setting and using call timeout
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
if (getenv('SKIP_SLOW_TESTS')) die('skip slow tests excluded by request');
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
if (strcasecmp(getenv('PDOTEST_USER'), "system") && strcasecmp(getenv('PDOTEST_USER'), "sys")) {
    die("skip needs to be run as a user with access to DBMS_LOCK");
}

$dbh = PDOTest::factory();
preg_match('/^[[:digit:]]+/', $dbh->getAttribute(PDO::ATTR_CLIENT_VERSION), $matches);
if (!(isset($matches[0]) && $matches[0] >= 18)) {
    die("skip works only with Oracle 18c or greater version of Oracle client libraries");
}

?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');

function mysleep($dbh, $t)
{
    $stmt = $dbh->prepare("begin dbms_lock.sleep(:t); end;");

    if (!$stmt) {
        $error = $dbh->errorInfo();
        echo "Prepare error was ", $error[2], "\n";
        return;
    }
    $stmt->bindParam(":t", $t, PDO::PARAM_INT);

    $r = $stmt->execute();
    if ($r) {
        echo "Execute succeeded\n";
    } else {
        $error = $dbh->errorInfo();
        echo "Execute error was ", $error[2], "\n";
    }
}

$dbh = PDOTest::factory();
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);

echo "Test 1\n";

$dbh->setAttribute(PDO::OCI_ATTR_CALL_TIMEOUT, 4000); // milliseconds

echo "call timeout:\n";
var_dump($dbh->getAttribute(PDO::OCI_ATTR_CALL_TIMEOUT));

$r = mysleep($dbh, 8); // seconds

?>
===DONE===
<?php exit(0); ?>
--EXPECTF--
Test 1
call timeout:
int(4000)
Execute error was OCIStmtExecute: ORA-%r(03136|03156)%r: %s
 (%s:%d)
===DONE===
PK�C�\��%~""tests/pecl_bug_6364.phptnu�[���--TEST--
PECL PDO_OCI Bug #6364 (segmentation fault on stored procedure call with OUT binds)
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
if (getenv('SKIP_ASAN')) die('xleak leaks memory under asan');
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$dbh = PDOTest::factory();

$dbh->exec("begin
              execute immediate 'drop table test6364';
              exception when others then
                if sqlcode <> -942 then
                  raise;
                end if;
            end;");

$dbh->exec ("create table test6364 (c1 varchar2(10), c2 varchar2(10), c3 varchar2(10), c4 varchar2(10), c5 varchar2(10))");

$dbh->exec ("create or replace procedure test6364_sp(p1 IN varchar2, p2 IN varchar2, p3 IN varchar2, p4 OUT varchar2, p5 OUT varchar2) as begin insert into test6364 (c1, c2, c3) values (p1, p2, p3); p4 := 'val4'; p5 := 'val5'; end;");

$stmt = $dbh->prepare("call test6364_sp('p1','p2','p3',?,?)");

$out_param1 = "a";
$out_param2 = "a";

$stmt->bindParam(1, $out_param1,PDO::PARAM_STR, 1024);
$stmt->bindParam(2, $out_param2,PDO::PARAM_STR, 1024);

$stmt->execute() or die ("Execution error: " . var_dump($dbh->errorInfo()));

var_dump($out_param1);
var_dump($out_param2);

foreach ($dbh->query("select * from test6364") as $row) {
    var_dump($row);
}

print "Done\n";
?>
--CLEAN--
<?php
require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');
$db->exec("begin
             execute immediate 'drop table test6364';
             exception when others then
               if sqlcode <> -942 then
                 raise;
               end if;
           end;");
$db->exec("DROP PROCEDURE test6364_sp");
?>
--EXPECT--
string(4) "val4"
string(4) "val5"
array(10) {
  ["c1"]=>
  string(2) "p1"
  [0]=>
  string(2) "p1"
  ["c2"]=>
  string(2) "p2"
  [1]=>
  string(2) "p2"
  ["c3"]=>
  string(2) "p3"
  [2]=>
  string(2) "p3"
  ["c4"]=>
  NULL
  [3]=>
  NULL
  ["c5"]=>
  NULL
  [4]=>
  NULL
}
Done
PK�C�\)��ptests/pdo_oci_stream_2.phptnu�[���--TEST--
PDO OCI: Insert and fetch 1K records from a table that contains 1 number and 2 LOB columns (stress test)
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
if (getenv('SKIP_SLOW_TESTS')) die('skip slow tests excluded by request');
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');

$db = PDOTest::factory();

$db->exec("begin
             execute immediate 'drop table test_pdo_oci_stream_2';
             exception when others then
               if sqlcode <> -942 then
                 raise;
               end if;
           end;");
$query = "create table test_pdo_oci_stream_2 (id number, data1 blob, data2 blob)";
$stmt = $db->prepare($query);
$stmt->execute();

function do_insert($db, $id, $data1, $data2)
{
    $db->beginTransaction();
    $stmt = $db->prepare("insert into test_pdo_oci_stream_2 (id, data1, data2) values (:id, empty_blob(), empty_blob()) returning data1, data2 into :blob1, :blob2");
    $stmt->bindParam(':id', $id);
    $stmt->bindParam(':blob1', $blob1, PDO::PARAM_LOB);
    $stmt->bindParam(':blob2', $blob2, PDO::PARAM_LOB);
    $blob1 = null;
    $blob2 = null;
    $stmt->execute();

    fwrite($blob1, $data1);
    fclose($blob1);
    fwrite($blob2, $data2);
    fclose($blob2);
    $db->commit();
}

$a1 = str_repeat('a', 4086);
$a2 = str_repeat('b', 4087);
$a3 = str_repeat('c', 4088);
$a4 = str_repeat('d', 4089);
$a5 = str_repeat('e', 4090);
$a6 = str_repeat('f', 4091);
$a7 = str_repeat('g', 4092);
$a8 = str_repeat('h', 4093);
$a9 = str_repeat('i', 4094);
$a10 = str_repeat('j', 4095);

printf("Inserting 1000 Records ... ");
for($i=0; $i<100; $i++) {
    do_insert($db, $i * 10 + 1, $a1, $a10);
    do_insert($db, $i * 10 + 2, $a2, $a9);
    do_insert($db, $i * 10 + 3, $a3, $a8);
    do_insert($db, $i * 10 + 4, $a4, $a7);
    do_insert($db, $i * 10 + 5, $a5, $a6);
    do_insert($db, $i * 10 + 6, $a6, $a5);
    do_insert($db, $i * 10 + 7, $a7, $a4);
    do_insert($db, $i * 10 + 8, $a8, $a3);
    do_insert($db, $i * 10 + 9, $a9, $a2);
    do_insert($db, $i * 10 + 10, $a10, $a1);
}
printf("Done\n");

$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);  // Let's use streams

// Since each column only has one lob descriptor, the last row is
// shown twice because the lob descriptor for each column is reused in
// the stream

$i = 0;
$j = 9;
$a_val = ord('a');
foreach($db->query("select data1 as d4_1, data2 as d4_2 from test_pdo_oci_stream_2 order by id") as $row) {
    $a = $row['d4_1'];
    $a1 = $row['d4_2'];

    $str1 = stream_get_contents($a);
    $str2 = stream_get_contents($a1);

    $str1len = strlen($str1);
    $str2len = strlen($str2);

    $b = ord($str1[0]);
    $b1 = ord($str2[0]);

    if (($b != ($a_val + $i)) && ($str1len != (4086 + $i)) &&
        ($b1 != ($a_val + $j)) && ($str2len != (4086 + $j))) {
        printf("There is a bug!\n");
        printf("Col1:\n");
        printf("a_val = %d\n", $a_val);
        printf("b     = %d\n", $b);
        printf("i     = %d\n", $i);
        printf("str1len = %d\n", $str1len);

        printf("Col2:\n");
        printf("a_val = %d\n", $a_val);
        printf("b1    = %d\n", $b1);
        printf("j     = %d\n", $j);
        printf("str2len = %d\n", $str1len);

    }
    $i++;
    if ($i>9)
        $i = 0;
    $j--;
    if ($j<0)
        $j = 9;
}
echo "Fetch operation done!\n";
?>
--CLEAN--
<?php
require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');
$db->exec("begin
             execute immediate 'drop table test_pdo_oci_stream_2';
             exception when others then
               if sqlcode <> -942 then
                 raise;
               end if;
           end;");
?>
--EXPECT--
Inserting 1000 Records ... Done
Fetch operation done!
PK�C�\��|Vgg$tests/pdo_oci_bind_input_output.phptnu�[���--TEST--
PDO_OCI: Test input/output parameter binding
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');

$dbh = PDOTest::factory();
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::ATTR_AUTOCOMMIT, false);

$sql = <<<SQL
    begin
        :p := :p + 100;
    end;
SQL;

$stmt = $dbh->prepare($sql);
$p = -1;
$stmt->bindParam(':p', $p, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT, 10);
$stmt->execute();
var_dump($p);

?>
--EXPECT--
string(2) "99"
PK�C�\�ci��tests/pdo_oci_quote1.phptnu�[���--TEST--
Test PDO->quote() for PDO_OCI
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::factory();

$db->exec("begin
             execute immediate 'drop table test_pdo_oci_quote1';
             exception when others then
               if sqlcode <> -942 then
                 raise;
               end if;
           end;");
$db->query("create table test_pdo_oci_quote1 (t varchar2(100))");
$stmt = $db->prepare('select * from test_pdo_oci_quote1');

// The intent is that the fetched data be identical to the unquoted string.
// Remember!: use bind variables instead of PDO->quote()

$a = array("", "a", "ab", "abc", "ab'cd", "a\b\n", "'", "''", "a'", "'z", "a''b", '"');
foreach ($a as $u) {
    $q = $db->quote($u);
    echo "Unquoted : ";
    var_dump($u);
    echo "Quoted   : ";
    var_dump($q);

    $db->exec("delete from test_pdo_oci_quote1");

    $db->query("insert into test_pdo_oci_quote1 (t) values($q)");
    $stmt->execute();
    var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
}

echo "Done\n";
?>
--CLEAN--
<?php
require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');
$db->exec("begin
             execute immediate 'drop table test_pdo_oci_quote1';
             exception when others then
               if sqlcode <> -942 then
                 raise;
               end if;
           end;");
?>
--EXPECT--
Unquoted : string(0) ""
Quoted   : string(2) "''"
array(1) {
  [0]=>
  array(1) {
    ["t"]=>
    NULL
  }
}
Unquoted : string(1) "a"
Quoted   : string(3) "'a'"
array(1) {
  [0]=>
  array(1) {
    ["t"]=>
    string(1) "a"
  }
}
Unquoted : string(2) "ab"
Quoted   : string(4) "'ab'"
array(1) {
  [0]=>
  array(1) {
    ["t"]=>
    string(2) "ab"
  }
}
Unquoted : string(3) "abc"
Quoted   : string(5) "'abc'"
array(1) {
  [0]=>
  array(1) {
    ["t"]=>
    string(3) "abc"
  }
}
Unquoted : string(5) "ab'cd"
Quoted   : string(8) "'ab''cd'"
array(1) {
  [0]=>
  array(1) {
    ["t"]=>
    string(5) "ab'cd"
  }
}
Unquoted : string(4) "a\b
"
Quoted   : string(6) "'a\b
'"
array(1) {
  [0]=>
  array(1) {
    ["t"]=>
    string(4) "a\b
"
  }
}
Unquoted : string(1) "'"
Quoted   : string(4) "''''"
array(1) {
  [0]=>
  array(1) {
    ["t"]=>
    string(1) "'"
  }
}
Unquoted : string(2) "''"
Quoted   : string(6) "''''''"
array(1) {
  [0]=>
  array(1) {
    ["t"]=>
    string(2) "''"
  }
}
Unquoted : string(2) "a'"
Quoted   : string(5) "'a'''"
array(1) {
  [0]=>
  array(1) {
    ["t"]=>
    string(2) "a'"
  }
}
Unquoted : string(2) "'z"
Quoted   : string(5) "'''z'"
array(1) {
  [0]=>
  array(1) {
    ["t"]=>
    string(2) "'z"
  }
}
Unquoted : string(4) "a''b"
Quoted   : string(8) "'a''''b'"
array(1) {
  [0]=>
  array(1) {
    ["t"]=>
    string(4) "a''b"
  }
}
Unquoted : string(1) """
Quoted   : string(3) "'"'"
array(1) {
  [0]=>
  array(1) {
    ["t"]=>
    string(1) """
  }
}
Done
PK�C�\H�A��tests/bug60994.phptnu�[���--TEST--
PDO OCI Bug #60994 (Reading a multibyte CLOB caps at 8192 characters)
--CREDITS--
Chuck Burgess
ashnazg@php.net
--EXTENSIONS--
mbstring
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php
require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$dbh = PDOTest::factory();
$dbh->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL);
$dbh->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);

$dbh->exec("begin
              execute immediate 'drop table pdo_oci_bug60994';
              exception when others then
                if sqlcode <> -942 then
                  raise;
                end if;
            end;");
$dbh->exec('CREATE TABLE pdo_oci_bug60994 (id NUMBER, data CLOB, data2 NCLOB)');

$id = null;
$insert = $dbh->prepare('INSERT INTO pdo_oci_bug60994 (id, data, data2) VALUES (:id, :data, :data2)');
$insert->bindParam(':id', $id, \PDO::PARAM_STR);
$select = $dbh->prepare("SELECT data, data2 FROM pdo_oci_bug60994 WHERE id = :id");


echo PHP_EOL, 'Test 1:  j', PHP_EOL;
$string1 = 'abc' . str_repeat('j', 8187) . 'xyz'; // 8193 chars total works fine here (even 1 million works fine, subject to memory_limit)
$id = 1;
$insert->bindParam(':data', $string1, \PDO::PARAM_STR, strlen($string1)); // length in bytes
$insert->bindParam(':data2', $string1, \PDO::PARAM_STR, strlen($string1));
$insert->execute();
$select->bindParam(':id', $id, \PDO::PARAM_STR);
$select->execute();
$row = $select->fetch();
$stream1 = stream_get_contents($row['DATA']);
$start1  = mb_substr($stream1, 0, 10);
$ending1 = mb_substr($stream1, -10);
echo 'size of string1 is ', strlen($string1), ' bytes, ', mb_strlen($string1), ' chars.', PHP_EOL;
echo 'size of stream1 is ', strlen($stream1), ' bytes, ', mb_strlen($stream1), ' chars.', PHP_EOL;
echo 'beg  of stream1 is ', $start1, PHP_EOL;
echo 'end  of stream1 is ', $ending1, PHP_EOL;
if ($string1 != $stream1 || $stream1 != stream_get_contents($row['DATA2'])) {
    echo 'Expected nclob value to match clob value for stream1', PHP_EOL;
}

echo PHP_EOL, 'Test 2:  £', PHP_EOL;
$string2 = 'abc' . str_repeat('£', 8187) . 'xyz'; // 8193 chars total is when it breaks
$id = 2;
$insert->bindParam(':data', $string2, \PDO::PARAM_STR, strlen($string2)); // length in bytes
$insert->bindParam(':data2', $string2, \PDO::PARAM_STR, strlen($string2));
$insert->execute();
$select->bindParam(':id', $id, \PDO::PARAM_STR);
$select->execute();
$row = $select->fetch();
$stream2 = stream_get_contents($row['DATA']);
$start2  = mb_substr($stream2, 0, 10);
$ending2 = mb_substr($stream2, -10);
echo 'size of string2 is ', strlen($string2), ' bytes, ', mb_strlen($string2), ' chars.', PHP_EOL;
echo 'size of stream2 is ', strlen($stream2), ' bytes, ', mb_strlen($stream2), ' chars.', PHP_EOL;
echo 'beg  of stream2 is ', $start2, PHP_EOL;
echo 'end  of stream2 is ', $ending2, PHP_EOL;
if ($string2 != $stream2 || $stream2 != stream_get_contents($row['DATA2'])) {
    echo 'Expected nclob value to match clob value for stream2', PHP_EOL;
}

echo PHP_EOL, 'Test 3:  Җ', PHP_EOL;
$string3 = 'abc' . str_repeat('Җ', 8187) . 'xyz'; // 8193 chars total is when it breaks
$id = 3;
$insert->bindParam(':data', $string3, \PDO::PARAM_STR, strlen($string3)); // length in bytes
$insert->bindParam(':data2', $string3, \PDO::PARAM_STR, strlen($string3));
$insert->execute();
$select->bindParam(':id', $id, \PDO::PARAM_STR);
$select->execute();
$row = $select->fetch();
$stream3 = stream_get_contents($row['DATA']);
$start3  = mb_substr($stream3, 0, 10);
$ending3 = mb_substr($stream3, -10);
echo 'size of string3 is ', strlen($string3), ' bytes, ', mb_strlen($string3), ' chars.', PHP_EOL;
echo 'size of stream3 is ', strlen($stream3), ' bytes, ', mb_strlen($stream3), ' chars.', PHP_EOL;
echo 'beg  of stream3 is ', $start3, PHP_EOL;
echo 'end  of stream3 is ', $ending3, PHP_EOL;
if ($string3 != $stream3 || $stream3 != stream_get_contents($row['DATA2'])) {
    echo 'Expected nclob value to match clob value for stream3', PHP_EOL;
}

echo PHP_EOL, 'Test 4:  の', PHP_EOL;
$string4 = 'abc' . str_repeat('の', 8187) . 'xyz'; // 8193 chars total is when it breaks
$id = 4;
$insert->bindParam(':data', $string4, \PDO::PARAM_STR, strlen($string4)); // length in bytes
$insert->bindParam(':data2', $string4, \PDO::PARAM_STR, strlen($string4));
$insert->execute();
$select->bindParam(':id', $id, \PDO::PARAM_STR);
$select->execute();
$row = $select->fetch();
$stream4 = stream_get_contents($row['DATA']);
$start4  = mb_substr($stream4, 0, 10);
$ending4 = mb_substr($stream4, -10);
echo 'size of string4 is ', strlen($string4), ' bytes, ', mb_strlen($string4), ' chars.', PHP_EOL;
echo 'size of stream4 is ', strlen($stream4), ' bytes, ', mb_strlen($stream4), ' chars.', PHP_EOL;
echo 'beg  of stream4 is ', $start4, PHP_EOL;
echo 'end  of stream4 is ', $ending4, PHP_EOL;
if ($string4 != $stream4 || $stream4 != stream_get_contents($row['DATA2'])) {
    echo 'Expected nclob value to match clob value for stream4', PHP_EOL;
}
?>
--CLEAN--
<?php
require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');
$db->exec("begin
             execute immediate 'drop table pdo_oci_bug60994';
             exception when others then
               if sqlcode <> -942 then
                 raise;
               end if;
           end;");
?>
--EXPECT--
Test 1:  j
size of string1 is 8193 bytes, 8193 chars.
size of stream1 is 8193 bytes, 8193 chars.
beg  of stream1 is abcjjjjjjj
end  of stream1 is jjjjjjjxyz

Test 2:  £
size of string2 is 16380 bytes, 8193 chars.
size of stream2 is 16380 bytes, 8193 chars.
beg  of stream2 is abc£££££££
end  of stream2 is £££££££xyz

Test 3:  Җ
size of string3 is 16380 bytes, 8193 chars.
size of stream3 is 16380 bytes, 8193 chars.
beg  of stream3 is abcҖҖҖҖҖҖҖ
end  of stream3 is ҖҖҖҖҖҖҖxyz

Test 4:  の
size of string4 is 24567 bytes, 8193 chars.
size of stream4 is 24567 bytes, 8193 chars.
beg  of stream4 is abcののののののの
end  of stream4 is のののののののxyz

PK�C�\��9�	�	tests/pdo_oci_templob_1.phptnu�[���--TEST--
PDO OCI: Test to verify all implicitly created temporary LOB are cleaned up
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?PHP

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');

$clobquery1 = "select TO_CLOB('Hello World') CLOB_DATA from dual";
$clobquery2 = "select TO_CLOB('Hello World') CLOB_DATA from dual";
$clobquery3 = "select TO_CLOB('Hello World') CLOB_DATA from dual";
$clobquery4 = "select TO_CLOB('Hello World') CLOB_DATA from dual";
$clobquery5 = "select TO_CLOB('Hello World') CLOB_DATA from dual";
$clobquery6 = "select TO_CLOB('Hello World') CLOB_DATA from dual";
$clobquery7 = "select TO_CLOB('Hello World') CLOB_DATA from dual";
$clobquery8 = "select TO_CLOB('Hello World') CLOB_DATA from dual";
$clobquery9 = "select TO_CLOB('Hello World') CLOB_DATA from dual";
$clobquery10 = "select TO_CLOB('Hello World') CLOB_DATA from dual";

$stmt= $db->prepare($clobquery1);
$stmt->execute();
$row = $stmt->fetch();
$stmt= $db->prepare($clobquery2);
$stmt->execute();
$row = $stmt->fetch();
$stmt= $db->prepare($clobquery3);
$stmt->execute();
$row = $stmt->fetch();
$stmt= $db->prepare($clobquery4);
$stmt->execute();
$row = $stmt->fetch();
$stmt= $db->prepare($clobquery5);
$stmt->execute();
$row = $stmt->fetch();
$stmt= $db->prepare($clobquery6);
$stmt->execute();
$row = $stmt->fetch();
$stmt= $db->prepare($clobquery7);
$stmt->execute();
$row = $stmt->fetch();
$stmt= $db->prepare($clobquery8);
$stmt->execute();
$row = $stmt->fetch();
$stmt= $db->prepare($clobquery9);
$stmt->execute();
$row = $stmt->fetch();
$stmt= $db->prepare($clobquery10);
$stmt->execute();
$row = $stmt->fetch();

$query1 = "SELECT SYS_CONTEXT('USERENV', 'SID') SID FROM DUAL";

$stmt1 = $db->prepare($query1);
$stmt1->execute();

$row1 = $stmt1->fetch();
$sid_value = $row1[0];

$query2 = "SELECT (CACHE_LOBS+NOCACHE_LOBS+ABSTRACT_LOBS) FROM V\$TEMPORARY_LOBS WHERE SID = :SID_VALUE";

$stmt2 = $db->prepare($query2);
$stmt2->bindParam(':SID_VALUE', $sid_value);
$stmt2->execute();

$row2 = $stmt2->fetch();
/* 1 temporary LOB still exists in V$TEMPORARY_LOBS since the destructor of $stmt is not yet called by PHP */
if ($row2[0] > 1)
{
  echo "TEMP_LOB is not yet cleared!" . $row2[0] . "\n";
}
else
{
  echo "Success! All the temporary LOB in previously closed statements are properly cleaned.\n";
}

?>
--EXPECT--
Success! All the temporary LOB in previously closed statements are properly cleaned.
PK�C�\s��#tests/pdo_oci_attr_client_info.phptnu�[���--TEST--
PDO_OCI: Attribute: Setting session client info
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');

$query = 'select client_info from v$session where sid = sys_context(\'USERENV\', \'SID\')';

$dbh = PDOTest::factory();

$stmt = $dbh->query($query);
$row = $stmt->fetch();
echo 'CLIENT_INFO NOT SET: ';
var_dump($row['client_info']);

var_dump($dbh->setAttribute(PDO::OCI_ATTR_CLIENT_INFO, "some client info"));

$stmt = $dbh->query($query);
$row = $stmt->fetch();
echo 'CLIENT_INFO SET: ';
var_dump($row['client_info']);

var_dump($dbh->setAttribute(PDO::OCI_ATTR_CLIENT_INFO, "something else!"));

$stmt = $dbh->query($query);
$row = $stmt->fetch();
echo 'CLIENT_INFO RESET: ';
var_dump($row['client_info']);

var_dump($dbh->setAttribute(PDO::OCI_ATTR_CLIENT_INFO, null));

$stmt = $dbh->query($query);
$row = $stmt->fetch();
echo 'CLIENT_INFO NULLED: ';
var_dump($row['client_info']);

echo "Done\n";

?>
--EXPECT--
CLIENT_INFO NOT SET: NULL
bool(true)
CLIENT_INFO SET: string(16) "some client info"
bool(true)
CLIENT_INFO RESET: string(15) "something else!"
bool(true)
CLIENT_INFO NULLED: NULL
Done
PK�C�\2����tests/pdo_oci_phpinfo.phptnu�[���--TEST--
PDO_OCI: phpinfo() output
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php
require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::factory();

ob_start();
phpinfo();
$tmp = ob_get_contents();
ob_end_clean();

$reg = 'PDO Driver for OCI 8 and later => enabled';
if (!preg_match("/$reg/", $tmp)) {
    printf("[001] Cannot find OCI PDO driver line in phpinfo() output\n");
}

print "done!";
?>
--EXPECT--
done!
PK�C�\,��$tests/pdo_oci_attr_autocommit_2.phptnu�[���--TEST--
PDO_OCI: Attribute: beginTransaction and native transactions
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$dbh = PDOTest::factory();

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$dbh->exec("begin
              execute immediate 'drop table test_pdo_oci_attr_autocommit_2';
              exception when others then
                if sqlcode <> -942 then
                  raise;
                end if;
            end;");
$dbh->exec("create table test_pdo_oci_attr_autocommit_2 (col1 varchar2(25))");

echo "Test 1 Check beginTransaction insertion\n";

$dbh->beginTransaction();
try {
    $dbh->exec("insert into test_pdo_oci_attr_autocommit_2 (col1) values ('data 1')");
    $dbh->exec("insert into test_pdo_oci_attr_autocommit_2 (col1) values ('data 2')");
    $dbh->commit();
}
catch (PDOException $e) {
    echo "Caught unexpected exception at line " . __LINE__ . "\n";
    echo $e->getMessage() . "\n";
    $dbh->rollback();
}

echo "Test 2 Cause an exception and test beginTransaction rollback\n";

$dbh->beginTransaction();
try {
    $dbh->exec("insert into test_pdo_oci_attr_autocommit_2 (col1) values ('not committed #1')");
    $dbh->exec("insert into test_pdo_oci_attr_autocommit_2 (col1) values ('data that is too long to fit and will barf')");
    $dbh->commit();
}
catch (PDOException $e) {
    echo "Caught expected exception at line " . __LINE__ . "\n";
    echo $e->getMessage() . "\n";
    $dbh->rollback();
}

echo "Test 3 Setting ATTR_AUTOCOMMIT to true will commit and end the transaction\n";

$dbh->exec("insert into test_pdo_oci_attr_autocommit_2 (col1) values ('data 3')");
$dbh->setAttribute(PDO::ATTR_AUTOCOMMIT, true);
print "PDO::ATTR_AUTOCOMMIT: ";
var_dump($dbh->getAttribute(PDO::ATTR_AUTOCOMMIT));
try {
    $dbh->rollback();
}
catch (PDOException $e) {
    echo "Caught expected exception at line " . __LINE__ . "\n";
    echo $e->getMessage() . "\n";
}

echo "Test 4 Setting ATTR_AUTOCOMMIT to false will commit and end the transaction\n";

$dbh->beginTransaction();
$dbh->exec("insert into test_pdo_oci_attr_autocommit_2 (col1) values ('data 4')");
$dbh->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
print "PDO::ATTR_AUTOCOMMIT: ";
var_dump($dbh->getAttribute(PDO::ATTR_AUTOCOMMIT));
try {
    $dbh->rollback();
}
catch (PDOException $e) {
    echo "Caught expected exception at line " . __LINE__ . "\n";
    echo $e->getMessage() . "\n";
}

echo "Test 5 Handle transactions ourselves\n";

print "PDO::ATTR_AUTOCOMMIT: ";
var_dump($dbh->getAttribute(PDO::ATTR_AUTOCOMMIT));

$dbh->exec("insert into test_pdo_oci_attr_autocommit_2 (col1) values ('not committed #2')");
$dbh->exec("rollback");
$dbh->exec("insert into test_pdo_oci_attr_autocommit_2 (col1) values ('data 5')");
$dbh->exec("insert into test_pdo_oci_attr_autocommit_2 (col1) values ('data 6')");

$dbh->exec("commit");

// Open new connection to really verify what was inserted

$dbh2 = PDOTest::factory();

echo "Query Results are:\n";
$s = $dbh2->prepare("select col1 from test_pdo_oci_attr_autocommit_2");
$s->execute();
while ($r = $s->fetch()) {
    echo $r[0] . "\n";
}

echo "Done\n";

?>
--CLEAN--
<?php
require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');
$db->exec("begin
             execute immediate 'drop table test_pdo_oci_attr_autocommit_2';
             exception when others then
               if sqlcode <> -942 then
                 raise;
               end if;
           end;");
?>
--EXPECTF--
Test 1 Check beginTransaction insertion
Test 2 Cause an exception and test beginTransaction rollback
Caught expected exception at line %d
SQLSTATE[HY000]: General error: 12899 OCIStmtExecute: ORA-12899: %s
%s
Test 3 Setting ATTR_AUTOCOMMIT to true will commit and end the transaction
PDO::ATTR_AUTOCOMMIT: bool(true)
Caught expected exception at line %d
There is no active transaction
Test 4 Setting ATTR_AUTOCOMMIT to false will commit and end the transaction
PDO::ATTR_AUTOCOMMIT: bool(false)
Caught expected exception at line %d
There is no active transaction
Test 5 Handle transactions ourselves
PDO::ATTR_AUTOCOMMIT: bool(false)
Query Results are:
data 1
data 2
data 3
data 4
data 5
data 6
Done
PK�C�\Mۀ��tests/checkliveness.phptnu�[���--TEST--
PDO OCI checkliveness (code coverage)
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');

$dsn = getenv('PDOTEST_DSN');
$user = getenv('PDOTEST_USER');
$pass = getenv('PDOTEST_PASS');
$attr = getenv('PDOTEST_ATTR');

try {
    $db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));
}
catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
    exit;
}

// This triggers the call to check liveness
try {
    $db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));
}
catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
    exit;
}

$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

try {
    $stmt = $db->prepare('SELECT * FROM dual');
    $stmt->execute();
    $row = $stmt->fetch();
    var_dump($row);
} catch (PDOException $e) {
    print $e->getMessage();
}

$db = null;
?>
--EXPECT--
array(2) {
  ["DUMMY"]=>
  string(1) "X"
  [0]=>
  string(1) "X"
}
PK�C�\Q�l�//tests/pdo_oci_attr_case.phptnu�[���--TEST--
PDO_OCI: Attribute: Column Case
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');

function do_query1($dbh)
{
    var_dump($dbh->getAttribute(PDO::ATTR_CASE));
    $s = $dbh->prepare("select dummy from dual");
    $s->execute();
    while ($r = $s->fetch(PDO::FETCH_ASSOC)) {
        var_dump($r);
    }
}

function do_query2($dbh, $mode)
{
    echo "Mode desired is $mode\n";
    $s = $dbh->prepare("select dummy from dual", array(PDO::ATTR_CASE, $mode));
    $s->execute();
    while ($r = $s->fetch(PDO::FETCH_ASSOC)) {
        var_dump($r);
    }
}

$dbh = PDOTest::factory();
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

echo "Test 1 - Force column names to lower case\n";
$dbh->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER);
do_query1($dbh);

echo "Test 2 - Leave column names as returned by the database driver\n";
$dbh->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL);
do_query1($dbh);

echo "Test 3 - Force column names to upper case\n";
$dbh->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);
do_query1($dbh);

echo "Test 4 - Setting on statement has no effect.  Attempt lower case but get upper\n";
$dbh->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL); // reset
do_query2($dbh, PDO::CASE_LOWER);

echo "Done\n";

?>
--EXPECT--
Test 1 - Force column names to lower case
int(2)
array(1) {
  ["dummy"]=>
  string(1) "X"
}
Test 2 - Leave column names as returned by the database driver
int(0)
array(1) {
  ["DUMMY"]=>
  string(1) "X"
}
Test 3 - Force column names to upper case
int(1)
array(1) {
  ["DUMMY"]=>
  string(1) "X"
}
Test 4 - Setting on statement has no effect.  Attempt lower case but get upper
Mode desired is 2
array(1) {
  ["DUMMY"]=>
  string(1) "X"
}
Done
PK�C�\i_�$tests/pdo_oci_attr_autocommit_3.phptnu�[���--TEST--
PDO_OCI: Attribute: closing a connection in non-autocommit mode commits data
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');

// Check connection can be created with AUTOCOMMIT off
putenv('PDOTEST_ATTR='.serialize(array(PDO::ATTR_AUTOCOMMIT=>false)));
$dbh = PDOTest::factory();

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

print "PDO::ATTR_AUTOCOMMIT: ";
var_dump($dbh->getAttribute(PDO::ATTR_AUTOCOMMIT));

echo "Insert data\n";

$dbh->exec("begin
              execute immediate 'drop table test_pdo_oci_attr_autocommit_3';
              exception when others then
                if sqlcode <> -942 then
                  raise;
                end if;
            end;");

$dbh->exec("create table test_pdo_oci_attr_autocommit_3 (col1 varchar2(20))");

$dbh->exec("insert into test_pdo_oci_attr_autocommit_3 (col1) values ('some data')");

$dbh = null; // close first connection

echo "Second connection should be able to see committed data\n";
$dbh2 = PDOTest::factory();
$s = $dbh2->prepare("select col1 from test_pdo_oci_attr_autocommit_3");
$s->execute();
while ($r = $s->fetch()) {
    echo "Data is: " . $r[0] . "\n";
}

echo "Done\n";

?>
--CLEAN--
<?php
require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');
$db->exec("begin
             execute immediate 'drop table test_pdo_oci_attr_autocommit_3';
             exception when others then
               if sqlcode <> -942 then
                 raise;
               end if;
           end;");
?>
--EXPECT--
PDO::ATTR_AUTOCOMMIT: bool(false)
Insert data
Second connection should be able to see committed data
Done
PK�C�\P���WWtests/bug46274_2.phptnu�[���--TEST--
Bug #46274 (pdo_pgsql - Segfault when using PDO::ATTR_STRINGIFY_FETCHES and blob)
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php
require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);

$db->exec("begin
             execute immediate 'drop table test46274_2';
             exception when others then
               if sqlcode <> -942 then
                 raise;
               end if;
           end;");

$db->beginTransaction();

$db->query('CREATE TABLE test46274_2 (id INT NOT NULL, blob1 BLOB)');

$stmt = $db->prepare("INSERT INTO test46274_2 (id, blob1) VALUES (:id, EMPTY_BLOB()) RETURNING blob1 INTO :foo");

$data = 'foo';
$blob = fopen('php://memory', 'a');
fwrite($blob, $data);
rewind($blob);

$id = 1;
$stmt->bindparam(':id', $id);
$stmt->bindparam(':foo', $blob, PDO::PARAM_LOB);
$stmt->execute();

$data = '';
$blob = fopen('php://memory', 'a');
fwrite($blob, $data);
rewind($blob);

$id = 1;
$stmt->bindparam(':id', $id);
$stmt->bindparam(':foo', $blob, PDO::PARAM_LOB);
$stmt->execute();

$res = $db->query("SELECT blob1 from test46274_2");
// Resource
var_dump($row = $res->fetch());
var_dump(fread($row[0], 1024));
fclose($row[0]);

// Empty string
var_dump($row = $res->fetch());
var_dump(fread($row[0], 1024));
fclose($row[0]);

?>
--CLEAN--
<?php
require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');
$db->exec("begin
             execute immediate 'drop table test46274_2';
             exception when others then
               if sqlcode <> -942 then
                 raise;
               end if;
           end;");
?>
--EXPECTF--
array(2) {
  ["blob1"]=>
  resource(%d) of type (stream)
  [0]=>
  resource(%d) of type (stream)
}
string(3) "foo"
array(2) {
  ["blob1"]=>
  resource(%d) of type (stream)
  [0]=>
  resource(%d) of type (stream)
}
string(0) ""
PK�C�\ u4)aatests/bug57702.phptnu�[���--TEST--
PDO OCI Bug #57702 (Multi-row BLOB fetches)
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');

// Note the PDO test setup sets PDO::ATTR_STRINGIFY_FETCHES to true
// (and sets PDO::ATTR_CASE to PDO::CASE_LOWER)

$db->exec("begin
             execute immediate 'drop table test57702';
             exception when others then
               if sqlcode <> -942 then
                 raise;
               end if;
           end;");
$query = "create table test57702 (id number, data1 blob, data2 blob)";
$stmt = $db->prepare($query);
$stmt->execute();

function do_insert($db, $id, $data1, $data2)
{
    $db->beginTransaction();
    $stmt = $db->prepare("insert into test57702 (id, data1, data2) values (:id, empty_blob(), empty_blob()) returning data1, data2 into :blob1, :blob2");
    $stmt->bindParam(':id', $id);
    $stmt->bindParam(':blob1', $blob1, PDO::PARAM_LOB);
    $stmt->bindParam(':blob2', $blob2, PDO::PARAM_LOB);
    $blob1 = null;
    $blob2 = null;
    $stmt->execute();

    fwrite($blob1, $data1);
    fclose($blob1);
    fwrite($blob2, $data2);
    fclose($blob2);
    $db->commit();
}

do_insert($db, 1, "row 1 col 1", "row 1 col 2");
do_insert($db, 2, "row 2 col 1", "row 2 col 2");

////////////////////

echo "First Query\n";

// Fetch it back
$stmt = $db->prepare('select data1, data2 from test57702 order by id');
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
var_dump($row['data1']);
var_dump($row['data2']);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
var_dump($row['data1']);
var_dump($row['data2']);

////////////////////

echo "\nSecond Query\n";

foreach($db->query("select data1 as d1, data2 as d2 from test57702 order by id") as $row) {
    var_dump($row['d1']);
    var_dump($row['d2']);
}

////////////////////

echo "\nThird Query\n";

$stmt = $db->prepare('select data1 as d3_1, data2 as d3_2 from test57702 order by id');

$rs = $stmt->execute();
$stmt->bindColumn('d3_1' , $clob1, PDO::PARAM_LOB);
$stmt->bindColumn('d3_2' , $clob2, PDO::PARAM_LOB);

while ($stmt->fetch(PDO::FETCH_BOUND)) {
    var_dump($clob1);
    var_dump($clob2);
}

////////////////////

echo "\nFourth Query\n";

$a = array();
$i = 0;
foreach($db->query("select data1 as d4_1, data2 as d4_2 from test57702 order by id") as $row) {
    $a[$i][0] = $row['d4_1'];
    $a[$i][1] = $row['d4_2'];
    $i++;
}

for ($i = 0; $i < count($a); $i++) {
    var_dump($a[$i][0]);
    var_dump($a[$i][1]);
}

////////////////////

echo "\nFifth Query\n";

$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);  // Let's use streams

// Since each column only has one lob descriptor, the last row is
// shown twice because the lob descriptor for each column is reused in
// the stream

$a = array();
$i = 0;
foreach($db->query("select data1 as d4_1, data2 as d4_2 from test57702 order by id") as $row) {
    $a[$i][0] = $row['d4_1'];
    $a[$i][1] = $row['d4_2'];
    $i++;
}

for ($i = 0; $i < count($a); $i++) {
    var_dump(stream_get_contents($a[$i][0]));
    var_dump(stream_get_contents($a[$i][1]));
}

////////////////////

echo "\nSixth Query\n";

$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);  // Let's use streams

$a = array();
$i = 0;
foreach($db->query("select data1 as d4_1, data2 as d4_2 from test57702 order by id") as $row) {
    $a[$i][0] = $row['d4_1'];
    $a[$i][1] = $row['d4_2'];
    var_dump(stream_get_contents($a[$i][0]));
    var_dump(stream_get_contents($a[$i][1]));
    $i++;
}

print "done\n";

?>
--CLEAN--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');
$db->exec("begin
             execute immediate 'drop table test57702';
             exception when others then
               if sqlcode <> -942 then
                 raise;
               end if;
           end;");
?>
--EXPECT--
First Query
string(11) "row 1 col 1"
string(11) "row 1 col 2"
string(11) "row 2 col 1"
string(11) "row 2 col 2"

Second Query
string(11) "row 1 col 1"
string(11) "row 1 col 2"
string(11) "row 2 col 1"
string(11) "row 2 col 2"

Third Query
string(11) "row 1 col 1"
string(11) "row 1 col 2"
string(11) "row 2 col 1"
string(11) "row 2 col 2"

Fourth Query
string(11) "row 1 col 1"
string(11) "row 1 col 2"
string(11) "row 2 col 1"
string(11) "row 2 col 2"

Fifth Query
string(11) "row 2 col 1"
string(11) "row 2 col 2"
string(11) "row 2 col 1"
string(11) "row 2 col 2"

Sixth Query
string(11) "row 1 col 1"
string(11) "row 1 col 2"
string(11) "row 2 col 1"
string(11) "row 2 col 2"
done
PK�C�\�*���tests/bug44301.phptnu�[���--TEST--
PDO OCI Bug #44301 (Segfault when an exception is thrown on persistent connections)
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php
putenv("PDO_OCI_TEST_ATTR=" . serialize(array(PDO::ATTR_PERSISTENT => true)));
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try {
    $stmt = $db->prepare('SELECT * FROM no_table');
    $stmt->execute();
} catch (PDOException $e) {
    print $e->getMessage();
}
$db = null;
?>
--EXPECTF--
SQLSTATE[HY000]: General error: 942 OCIStmtExecute: ORA-00942: table or view %Sdoes not exist
 (%soci_statement.c:%d)
PK�C�\�����tests/pdo_oci_attr_client.phptnu�[���--TEST--
PDO_OCI: Attribute: Client version
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');

$dbh = PDOTest::factory();

echo "ATTR_CLIENT_VERSION: ";
$cv = $dbh->getAttribute(PDO::ATTR_CLIENT_VERSION);
var_dump($cv);

$s = explode(".", $cv);
if (count($s) > 1 && (($s[0] == 10 && $s[1] >= 2) || $s[0] >= 11)) {
    if (count($s) != 5) {
        echo "Wrong number of values in array\nVersion was: ";
        var_dump($cv);
    } else {
        echo "Version OK, so far as can be portably checked\n";
    }
} else {
    if (count($s) != 2) {
        echo "Wrong number of values in array\nVersion was: ";
        var_dump($cv);
    } else {
        echo "Version OK, so far as can be portably checked\n";
    }
}

echo "Done\n";

?>
--EXPECTF--
ATTR_CLIENT_VERSION: string(%d) "%d.%s"
Version OK, so far as can be portably checked
Done
PK�C�\0����tests/pdo_oci_fread_1.phptnu�[���--TEST--
PDO_OCI: check fread() EOF
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
if (!strpos(strtolower(getenv('PDOTEST_DSN')), 'charset=we8mswin1252')) die('skip expected output valid for WE8MSWIN1252 character set');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');

$dbh = PDOTest::factory();

$dbh->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);

// Initialization
$stmtarray = array(
    "begin
       execute immediate 'drop table test_oci_fread_1';
       exception when others then
         if sqlcode <> -942 then
           raise;
         end if;
     end;",
    "create table test_oci_fread_1 (id number, data clob)",
    "declare
     lob1 clob := 'abc' || lpad('j',4020,'j') || 'xyz';
     begin
       insert into test_oci_fread_1 (id,data) values (1, lob1);
     end;"
);

foreach ($stmtarray as $stmt) {
    $dbh->exec($stmt);
}

echo "Test 1\n";

$s = $dbh->query("select data from test_oci_fread_1 where id = 1");
$r = $s->fetch();
$sh = $r['data'];

while (!feof($sh)) {
    $buffer = fread($sh,1024);
    echo '*'.$buffer.'*';
}
echo "\n";
fclose($sh);
?>
--CLEAN--
<?php
require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');
$db->exec("begin
             execute immediate 'drop table test_oci_fread_1';
             exception when others then
               if sqlcode <> -942 then
                 raise;
               end if;
           end;");
?>
--EXPECT--
Test 1
*abcjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj**jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj**jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj**jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjxyz*
PK�C�\��D{{"tests/pdo_oci_attr_prefetch_2.phptnu�[���--TEST--
PDO_OCI: Attribute: prefetch on statements
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');

$dbh = PDOTest::factory();

$s = $dbh->prepare("select '' as myempty, null as mynull from dual", array(PDO::ATTR_PREFETCH => 101));

echo "Test 1: Can't set prefetch after prepare\n";
var_dump($s->setAttribute(PDO::ATTR_PREFETCH, 102));

// Verify can fetch
$s = $dbh->prepare("select dummy from dual" );
$s->execute();
while ($r = $s->fetch()) {
    echo $r[0] . "\n";
}

echo "Test 2: Turn off prefetching\n";
$s = $dbh->prepare("select '' as myempty, null as mynull from dual", array(PDO::ATTR_PREFETCH => 0));
$s = $dbh->prepare("select dummy from dual" );
$s->execute();
while ($r = $s->fetch()) {
    echo $r[0] . "\n";
}

echo "Done\n";

?>
--EXPECTF--
Test 1: Can't set prefetch after prepare

Warning: PDOStatement::setAttribute(): SQLSTATE[IM001]: Driver does not support this function: This driver doesn't support setting attributes in %s on line %d
bool(false)
X
Test 2: Turn off prefetching
X
Done
PK�C�\
Ʃ�kk"tests/pdo_oci_attr_drivername.phptnu�[���--TEST--
PDO_OCI: Attribute: verify driver name
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');

$dbh = PDOTest::factory();
var_dump($dbh->getAttribute(PDO::ATTR_DRIVER_NAME));

echo "Done\n";
?>
--EXPECT--
string(3) "oci"
Done
PK�C�\9>����tests/pdo_oci_stream_1.phptnu�[���--TEST--
PDO_OCI: stream_get_contents length & offset test
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
if (!strpos(strtolower(getenv('PDOTEST_DSN')), 'charset=we8mswin1252')) die('skip expected output valid for WE8MSWIN1252 character set');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');

$dbh = PDOTest::factory();

$dbh->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);

// Initialization
$stmtarray = array(
    "begin
       execute immediate 'drop table test_pdo_oci_stream_1';
       exception when others then
         if sqlcode <> -942 then
           raise;
         end if;
     end;",
    "create table test_pdo_oci_stream_1 (id number, data clob)",
);

foreach ($stmtarray as $stmt) {
    $dbh->exec($stmt);
}

$dbh->exec("
  declare
    lob1 clob := 'abc' || lpad('j',30000,'j') || 'xyz';
   begin
    insert into test_pdo_oci_stream_1 (id,data) values (1, 'abcdefghijklmnopqrstuvwxyz');
    insert into test_pdo_oci_stream_1 (id,data) values (2, lob1);
  end;");

echo "Test 1\n";

$s = $dbh->prepare("select data from test_pdo_oci_stream_1 where id = 1");
$s->execute();
$r = $s->fetch();

// stream_get_contents ( resource $handle [, int $maxlength = -1 [, int $offset = -1 ]] )
echo 'Read '.stream_get_contents($r['data'], 1, 1)."$\n";  // b
echo 'Read '.stream_get_contents($r['data'], 2, 1)."$\n";  // cd
echo 'Read '.stream_get_contents($r['data'], 2, 0)."$\n";  // ab
echo 'Read '.stream_get_contents($r['data'], 26, 0)."$\n"; // abcdefghijklmnopqrstuvwxyz
echo 'Read '.stream_get_contents($r['data'], 27, 0)."$\n"; // abcdefghijklmnopqrstuvwxyz
echo 'Read '.stream_get_contents($r['data'], 27, 1)."$\n"; // bcdefghijklmnopqrstuvwxyz
echo 'Read '.stream_get_contents($r['data'], 1, 20)."$\n"; // u
echo 'Read '.stream_get_contents($r['data'], 1, 25)."$\n"; // z
echo 'Read '.stream_get_contents($r['data'], 1, 26)."$\n"; // <blank>
echo 'Read '.stream_get_contents($r['data'], 1, 0)."$\n";  // a

echo "\nTest 2\n";

$s = $dbh->prepare("select data from test_pdo_oci_stream_1 where id = 2");
$s->execute();
$r = $s->fetch();

echo 'Read '.stream_get_contents($r['data'], 5, 0)."\n";           // abcjj
echo 'Read '.stream_get_contents($r['data'], 5, 2)."\n";           // cjjjj
echo 'Read '.stream_get_contents($r['data'], 6, 1)."\n";           // bcjjjj
echo 'Read '.strlen(stream_get_contents($r['data'], -1,0))."\n";   // 30006
echo 'Read '.strlen(stream_get_contents($r['data'], 0,0))."\n";    // 0
echo 'Read '.strlen(stream_get_contents($r['data'], 0,1))."\n";    // 0
echo 'Read '.strlen(stream_get_contents($r['data'], 10,100))."\n"; // 10
echo 'Read '.stream_get_contents($r['data'], 6, 30000)."\n";       // jjjxyz
echo 'Read '.stream_get_contents($r['data'], 7, 30000)."\n";       // jjjxyz
echo 'Read '.strlen(stream_get_contents($r['data']))."\n";         // 0
echo 'Read '.strlen(stream_get_contents($r['data'], 0))."\n";      // 0
echo 'Read '.strlen(stream_get_contents($r['data'], -1))."\n";     // 0
echo 'Read '.stream_get_contents($r['data'], -1, 30000)."\n";      // jjjxyz
?>
--CLEAN--
<?php
require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');
$db->exec("begin
             execute immediate 'drop table test_pdo_oci_stream_1';
             exception when others then
               if sqlcode <> -942 then
                 raise;
               end if;
           end;");
?>
--EXPECT--
Test 1
Read b$
Read cd$
Read ab$
Read abcdefghijklmnopqrstuvwxyz$
Read abcdefghijklmnopqrstuvwxyz$
Read bcdefghijklmnopqrstuvwxyz$
Read u$
Read z$
Read $
Read a$

Test 2
Read abcjj
Read cjjjj
Read bcjjjj
Read 30006
Read 0
Read 0
Read 10
Read jjjxyz
Read jjjxyz
Read 0
Read 0
Read 0
Read jjjxyz
PK�C�\{���33tests/pdo_oci_bind_bool.phptnu�[���--TEST--
PDO_OCI: Bind boolean parameters
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');

$conn = PDOTest::factory();

$stmt = $conn->prepare('SELECT ?, ? FROM DUAL');
$stmt->bindValue(1, true, PDO::PARAM_BOOL);
$stmt->bindValue(2, false, PDO::PARAM_BOOL);
$stmt->execute();
var_dump($stmt->fetchAll(PDO::FETCH_NUM));

?>
--EXPECT--
array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(1) "1"
    [1]=>
    string(1) "0"
  }
}
PK�C�\?
�/<4<4%tests/pdo_oci_stmt_getcolumnmeta.phptnu�[���--TEST--
PDO_OCI: PDOStatement->getColumnMeta
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
$db = PDOTest::factory();
if (version_compare($db->getAttribute(PDO::ATTR_SERVER_VERSION), 12) < 0) die('xfail CI is failing with Oracle XE 11g');
?>
--FILE--
<?php

echo "Preparations before the test\n";

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
try {
    $db = PDOTest::factory();

    $db->exec("begin
                 execute immediate 'drop table test_pdo_oci_stmt_getcolumnmeta';
                 exception when others then
                   if sqlcode <> -942 then
                     raise;
                   end if;
               end;");
    $db->exec("CREATE TABLE test_pdo_oci_stmt_getcolumnmeta(id INT)");

    $db->beginTransaction();

    $stmt = $db->prepare('SELECT id FROM test_pdo_oci_stmt_getcolumnmeta ORDER BY id ASC');

    echo "Test 1. calling function with invalid parameters\n";

    // execute() has not been called yet
    // NOTE: no warning
    $tmp = $stmt->getColumnMeta(0);
    printf(" 1.1 Expecting false got %s\n", var_export($tmp, true));

    echo(" 1.2 ");
    $stmt->execute();
    // PDOStatement::getColumnMeta() expects exactly 1 argument, 0 given in
    try {
        $tmp = $stmt->getColumnMeta();
    } catch (ArgumentCountError $e) {
        if (false !== $tmp) {
            printf("[1.2] Expecting false got %s\n", var_export($tmp, true));
        }
        echo $e->getMessage(), "\n";
    }

    // invalid offset
    echo " 1.3 ";
    try {
        $tmp = $stmt->getColumnMeta(-1);
    } catch (ValueError $e) {
        if (false !== $tmp) {
            printf("[1.3] Expecting false got %s\n", var_export($tmp, true));
        }
        echo $e->getMessage(), "\n";
    }

    // PDOStatement::getColumnMeta(): Argument #1 must be of type int, array given in
    echo " 1.4 ";
    try {
        $tmp = $stmt->getColumnMeta(array());
    } catch (TypeError $e) {
        if (false !== $tmp)
            printf("[1.4] Expecting false got %s\n", var_export($tmp, true));
        echo $e->getMessage(), "\n";
    }

    // PDOStatement::getColumnMeta() expects exactly 1 argument, 2 given in
    echo " 1.5 ";
    try {
        $tmp = $stmt->getColumnMeta(1, 1);
    } catch (ArgumentCountError $e) {
        if (false !== $tmp)
            printf("[1.5] Expecting false got %s\n", var_export($tmp, true));
        echo $e->getMessage(), "\n";
    }

    // invalid offset
    $tmp = $stmt->getColumnMeta(1);
    printf(" 1.6 Expecting false because of invalid offset got %s\n", var_export($tmp, true));

    echo "Test 2. testing return values\n";
    echo "Test 2.1 testing array returned\n";

    $stmt = $db->prepare('SELECT id FROM test_pdo_oci_stmt_getcolumnmeta ORDER BY id ASC');
    $stmt->execute();
    $native = $stmt->getColumnMeta(0);
    if (count($native) == 0) {
        printf("[008] Meta data seems wrong, %s / %s\n",
            var_export($native, true), var_export($emulated, true));
    }


    function test_return($meta, $offset, $native_type, $pdo_type){
        if (empty($meta)) {
            printf("[%03d + 2] getColumnMeta() failed, %d - %s\n", $offset,
                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
            return false;
        }
        $elements = array('flags', 'scale', 'name', 'len', 'precision', 'pdo_type');
        foreach ($elements as $k => $element)
            if (!isset($meta[$element])) {
                printf("[%03d + 3] Element %s missing, %s\n", $offset,
                    $element, var_export($meta, true));
                return false;
            }

        if (!is_null($native_type)) {
            if (!isset($meta['native_type'])) {
                printf("[%03d + 4] Element native_type missing, %s\n", $offset,
                    var_export($meta, true));
                return false;
            }

            if (!is_array($native_type))
                $native_type = array($native_type);

            $found = false;
            foreach ($native_type as $k => $type) {
                if ($meta['native_type'] == $type) {
                    $found = true;
                    break;
                }
            }

            if (!$found) {
                printf("[%03d + 5] Expecting native type %s, %s\n", $offset,
                    var_export($native_type, true), var_export($meta, true));
                return false;
            }
        }

        if (!is_null($pdo_type) && ($meta['pdo_type'] != $pdo_type)) {
            printf("[%03d + 6] Expecting PDO type %s got %s (%s)\n", $offset,
                $pdo_type, var_export($meta, true), var_export($meta['native_type']));
            return false;
        }

        return true;
    }


    function test_meta(&$db, $offset, $sql_type, $value, $native_type, $pdo_type) {

        $db->exec("begin
                     execute immediate 'drop table test_pdo_oci_stmt_getcolumnmeta';
                     exception when others then
                       if sqlcode <> -942 then
                         raise;
                       end if;
                   end;");

        $sql = sprintf('CREATE TABLE test_pdo_oci_stmt_getcolumnmeta(id INT, label %s)', $sql_type);
        $stmt = $db->prepare($sql);
        $stmt->execute();

        if (!$db->exec(sprintf("INSERT INTO test_pdo_oci_stmt_getcolumnmeta(id, label) VALUES (1, '%s')", $value))) {
            printf("[%03d] + 1] Insert failed, %d - %s\n", $offset,
                $db->errorCode(), var_export($db->errorInfo(), true));
            return false;
        }

        $stmt = $db->prepare('SELECT id, label FROM test_pdo_oci_stmt_getcolumnmeta');
        $stmt->execute();
        $meta = $stmt->getColumnMeta(1);
        return test_return($meta, $offset, $native_type, $pdo_type);
    }

    echo "Test 2.2 testing numeric columns\n";

    test_meta($db, 20, 'NUMBER'         , 0                    , 'NUMBER', PDO::PARAM_STR);
    test_meta($db, 30, 'NUMBER'         , 256                  , 'NUMBER', PDO::PARAM_STR);
    test_meta($db, 40, 'INT'            , 256                  , 'NUMBER', PDO::PARAM_STR);
    test_meta($db, 50, 'INTEGER'        , 256                  , 'NUMBER', PDO::PARAM_STR);
    test_meta($db, 60, 'NUMBER'         , 256.01               , 'NUMBER', PDO::PARAM_STR);
    test_meta($db, 70, 'NUMBER'         , -8388608             , 'NUMBER', PDO::PARAM_STR);

    test_meta($db, 80, 'NUMBER'         , 2147483648           , 'NUMBER', PDO::PARAM_STR);
    test_meta($db, 90, 'NUMBER'         , 4294967295           , 'NUMBER', PDO::PARAM_STR);

    test_meta($db, 100, 'DEC'             , 1.01               , 'NUMBER'       , PDO::PARAM_STR);
    test_meta($db, 110, 'DECIMAL'         , 1.01               , 'NUMBER'       , PDO::PARAM_STR);
    test_meta($db, 120, 'FLOAT'           , 1.01               , 'FLOAT'        , PDO::PARAM_STR);
    test_meta($db, 130, 'DOUBLE PRECISION', 1.01               , 'FLOAT'        , PDO::PARAM_STR);
    test_meta($db, 140, 'BINARY_FLOAT'    , 1.01               , 'BINARY_FLOAT' , PDO::PARAM_STR);
    test_meta($db, 150, 'BINARY_DOUBLE'   , 1.01               , 'BINARY_DOUBLE', PDO::PARAM_STR);

    echo "Test 2.3 testing temporal columns\n";

    $db->exec("alter session set nls_date_format='YYYY-MM-DD'");
    test_meta($db, 160, 'DATE'           , '2008-04-23'        , 'DATE', PDO::PARAM_STR);

    echo "Test 2.4 testing string columns\n";

    test_meta($db, 170, 'CHAR(1)'       , 'a'                  , 'CHAR'     , PDO::PARAM_STR);
    test_meta($db, 180, 'CHAR(10)'      , '0123456789'         , 'CHAR'     , PDO::PARAM_STR);
    test_meta($db, 190, 'CHAR(255)'     , str_repeat('z', 255) , 'CHAR'     , PDO::PARAM_STR);
    test_meta($db, 200, 'VARCHAR(1)'    , 'a'                  , 'VARCHAR2' , PDO::PARAM_STR);
    test_meta($db, 210, 'VARCHAR(10)'   , '0123456789'         , 'VARCHAR2' , PDO::PARAM_STR);
    test_meta($db, 220, 'VARCHAR(255)'  , str_repeat('z', 255) , 'VARCHAR2' , PDO::PARAM_STR);
    test_meta($db, 230, 'VARCHAR2(1)'   , 'a'                  , 'VARCHAR2' , PDO::PARAM_STR);
    test_meta($db, 240, 'VARCHAR2(10)'  , '0123456789'         , 'VARCHAR2' , PDO::PARAM_STR);
    test_meta($db, 250, 'VARCHAR2(255)' , str_repeat('z', 255) , 'VARCHAR2' , PDO::PARAM_STR);

    test_meta($db, 260, 'NCHAR(1)'      , 'a'                  , 'NCHAR'    , PDO::PARAM_STR);
    test_meta($db, 270, 'NCHAR(10)'     , '0123456789'         , 'NCHAR'    , PDO::PARAM_STR);
    test_meta($db, 280, 'NCHAR(255)'    , str_repeat('z', 255) , 'NCHAR'    , PDO::PARAM_STR);
    test_meta($db, 290, 'NVARCHAR2(1)'  , 'a'                  , 'NVARCHAR2', PDO::PARAM_STR);
    test_meta($db, 300, 'NVARCHAR2(10)' , '0123456789'         , 'NVARCHAR2', PDO::PARAM_STR);
    test_meta($db, 310, 'NVARCHAR2(255)', str_repeat('z', 255) , 'NVARCHAR2', PDO::PARAM_STR);

    echo "Test 2.5 testing lobs columns\n";

    test_meta($db, 320, 'CLOB'          , str_repeat('b', 255) , 'CLOB'    , PDO::PARAM_LOB);
    test_meta($db, 330, 'BLOB'          , str_repeat('b', 256) , 'BLOB'    , PDO::PARAM_LOB);
    test_meta($db, 340, 'NCLOB'         , str_repeat('b', 255) , 'NCLOB'   , PDO::PARAM_LOB);

    test_meta($db, 350, 'LONG'          , str_repeat('b', 256) , 'LONG'    , PDO::PARAM_STR);
    test_meta($db, 360, 'LONG RAW'      , str_repeat('b', 256) , 'LONG RAW', PDO::PARAM_STR);
    test_meta($db, 370, 'RAW(256)'      , str_repeat('b', 256) , 'RAW'     , PDO::PARAM_STR);


    $db->exec("begin
                     execute immediate 'drop table test_pdo_oci_stmt_getcolumnmeta';
                     exception when others then
                       if sqlcode <> -942 then
                         raise;
                       end if;
                   end;");
    echo "Test 2.6 testing function return\n";

    $stmt = $db->query('SELECT count(*) FROM dual');
    $meta = $stmt->getColumnMeta(0);
    test_return($meta, 380, 'NUMBER', PDO::PARAM_STR);
    $stmt = $db->query("SELECT TO_DATE('2008-04-23') FROM dual");
    $meta = $stmt->getColumnMeta(0);
    test_return($meta, 390, 'DATE', PDO::PARAM_STR);
    $stmt = $db->query("SELECT TO_CHAR(542) FROM dual");
    $meta = $stmt->getColumnMeta(0);
    test_return($meta, 400, 'VARCHAR2', PDO::PARAM_STR);


    echo "Test 2.7 testing flags returned\n";

    $sql = sprintf('CREATE TABLE test_pdo_oci_stmt_getcolumnmeta(id INT NOT NULL, label INT NULL)');
    $stmt = $db->prepare($sql);
    $stmt->execute();
    $db->exec('INSERT INTO test_pdo_oci_stmt_getcolumnmeta(id, label) VALUES (1, 1)');
    $stmt = $db->query('SELECT id, label FROM test_pdo_oci_stmt_getcolumnmeta');
    $meta = $stmt->getColumnMeta(0);
    // verify the flags array contains a not_null flag and not nullable flags
    if (!isset($meta['flags'])) {
        printf("[1001] No flags contained in metadata %s\n", var_export($meta, true));
    } else {
        $flags = $meta['flags'];
        $found = false;
        foreach ($flags as $k => $flag) {
            if ($flag == 'not_null')
                $found = true;
            if ($flag == 'nullable')
                printf("[1003] Flags seem wrong %s\n", var_export($meta, true));
        }
        if (!$found)
            printf("[1002] Flags seem wrong %s\n", var_export($meta, true));
    }
    $meta = $stmt->getColumnMeta(1);
    // verify the flags array contains a nullable flag and not not_null flags
    if (!isset($meta['flags'])) {
        printf("[1003] No flags contained in metadata %s\n", var_export($meta, true));
    } else {
        $flags = $meta['flags'];
        $found = false;
        foreach ($flags as $k => $flag) {
            if ($flag == 'not_null')
                printf("[1004] Flags seem wrong %s\n", var_export($meta, true));
            if ($flag == 'nullable')
                $found = true;
        }
        if (!$found)
            printf("[1005] Flags seem wrong %s\n", var_export($meta, true));
    }

} catch (PDOException $e) {
    // we should never get here, we use warnings, but never trust a system...
    printf("[001] %s, [%s} %s\n",
        $e->getMessage(), $db->errorInfo(), implode(' ', $db->errorInfo()));
}

print "done!\n";
?>
--CLEAN--
<?php
require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');
$db->exec("begin
             execute immediate 'drop table test_pdo_oci_stmt_getcolumnmeta';
             exception when others then
               if sqlcode <> -942 then
                 raise;
               end if;
           end;");
?>
--EXPECT--
Preparations before the test
Test 1. calling function with invalid parameters
 1.1 Expecting false got false
 1.2 PDOStatement::getColumnMeta() expects exactly 1 argument, 0 given
 1.3 PDOStatement::getColumnMeta(): Argument #1 ($column) must be greater than or equal to 0
 1.4 PDOStatement::getColumnMeta(): Argument #1 ($column) must be of type int, array given
 1.5 PDOStatement::getColumnMeta() expects exactly 1 argument, 2 given
 1.6 Expecting false because of invalid offset got false
Test 2. testing return values
Test 2.1 testing array returned
Test 2.2 testing numeric columns
Test 2.3 testing temporal columns
Test 2.4 testing string columns
Test 2.5 testing lobs columns
Test 2.6 testing function return
Test 2.7 testing flags returned
done!
PK�C�\�t�̉�$tests/pdo_oci_attr_autocommit_1.phptnu�[���--TEST--
PDO_OCI: Attribute: Basic autocommit functionality
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');

$dbh = PDOTest::factory();

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

print "PDO::ATTR_AUTOCOMMIT: Default: ";
var_dump($dbh->getAttribute(PDO::ATTR_AUTOCOMMIT));

echo "Change setting to false - ";

$dbh->setAttribute(PDO::ATTR_AUTOCOMMIT, false);

print "PDO::ATTR_AUTOCOMMIT: ";
var_dump($dbh->getAttribute(PDO::ATTR_AUTOCOMMIT));

echo "Change setting back to true - ";

$dbh->setAttribute(PDO::ATTR_AUTOCOMMIT, true);

print "PDO::ATTR_AUTOCOMMIT: ";
var_dump($dbh->getAttribute(PDO::ATTR_AUTOCOMMIT));

// Use 2nd connection to check that autocommit does commit

echo "Insert data\n";
$dbh->exec("begin
              execute immediate 'drop table test_pdo_oci_attr_autocommit_1';
              exception when others then
                if sqlcode <> -942 then
                  raise;
                end if;
            end;");
$dbh->exec("create table test_pdo_oci_attr_autocommit_1 (col1 varchar2(20))");
$dbh->exec("insert into test_pdo_oci_attr_autocommit_1 (col1) values ('some data')");

$dbh2 = PDOTest::factory();

echo "Second connection should be able to see committed data\n";
$s = $dbh2->prepare("select col1 from test_pdo_oci_attr_autocommit_1");
$s->execute();
while ($r = $s->fetch()) {
    echo "Data is: " . $r[0] . "\n";
}

echo "Done\n";

?>
--CLEAN--
<?php
require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');
$db->exec("begin
             execute immediate 'drop table test_pdo_oci_attr_autocommit_1';
             exception when others then
               if sqlcode <> -942 then
                 raise;
               end if;
           end;");
?>
--EXPECT--
PDO::ATTR_AUTOCOMMIT: Default: bool(true)
Change setting to false - PDO::ATTR_AUTOCOMMIT: bool(false)
Change setting back to true - PDO::ATTR_AUTOCOMMIT: bool(true)
Insert data
Second connection should be able to see committed data
Data is: some data
Done
PK�C�\��TT"tests/pdo_oci_debugdumpparams.phptnu�[���--TEST--
PDO_OCI: Bug #69356 (PDOStatement::debugDumpParams() truncates query)
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php
require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');

$db = PDOTest::factory();
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
$stmt = $db->query("
    SELECT '
        Dumps the information contained by a prepared statement directly on the output. It will provide the SQL query in use, the number of parameters used (Params), the list of parameters, with their name, type (paramtype) as an integer, their key name or position, and the position in the query (if this is supported by the PDO driver, otherwise, it will be -1).
        This is a debug function, which dump directly the data on the normal output.
        Tip:
        As with anything that outputs its result directly to the browser, the output-control functions can be used to capture the output of this function, and save it in a string (for example).
        This will only dumps the parameters in the statement at the moment of the dump. Extra parameters are not stored in the statement, and not displayed.
    ' FROM DUAL
");
var_dump($stmt->debugDumpParams());
?>
--EXPECTF--
SQL: [%d]%s
    SELECT '
        Dumps the information contained by a prepared statement directly on the output. It will provide the SQL query in use, the number of parameters used (Params), the list of parameters, with their name, type (paramtype) as an integer, their key name or position, and the position in the query (if this is supported by the PDO driver, otherwise, it will be -1).
        This is a debug function, which dump directly the data on the normal output.
        Tip:
        As with anything that outputs its result directly to the browser, the output-control functions can be used to capture the output of this function, and save it in a string (for example).
        This will only dumps the parameters in the statement at the moment of the dump. Extra parameters are not stored in the statement, and not displayed.
    ' FROM DUAL

Params:  0
NULL
PK�C�\���q''tests/pdo_oci_attr_server.phptnu�[���--TEST--
PDO_OCI: Attribute: Server version and info
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');

$dbh = PDOTest::factory();

echo "Test 1\n";
echo "ATTR_SERVER_VERSION: ";
var_dump($dbh->getAttribute(PDO::ATTR_SERVER_VERSION));

echo "Test 2\n";
echo "ATTR_SERVER_INFO\n";
$si = $dbh->getAttribute(PDO::ATTR_SERVER_INFO);
$pos = strpos($si, "Oracle");
if ($pos === 0) {
    echo "Found 'Oracle' at position $pos as expected\n";
} else {
    echo "Unexpected result.  Server info was:\n";
    var_dump($si);
}

echo "Done\n";

?>
--EXPECTF--
Test 1
ATTR_SERVER_VERSION: string(%d) "%d.%d.%d.%d.%d"
Test 2
ATTR_SERVER_INFO
Found 'Oracle' at position 0 as expected
Done
PK�C�\�;���tests/bug41996.phptnu�[���--TEST--
PDO OCI Bug #41996 (Problem accessing Oracle ROWID)
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php
require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');

$stmt = $db->prepare('SELECT rowid FROM dual');
$stmt->execute();
$row = $stmt->fetch();
var_dump(strlen($row[0]) > 0);
?>
--EXPECT--
bool(true)
PK�C�\����tests/README.mdnu�[���# PDO_OCI TESTS

The PDO_OCI tests augment the generic PDO tests.

To run the PDO tests for PDO_OCI, execute commands similar to:

    export PDO_TEST_DIR=/wherever/php-src/ext/pdo/tests/
    export PDO_OCI_TEST_DIR=/wherever/pecl-database-pdo_oci/tests/

    export PDO_OCI_TEST_DSN='oci:dbname=localhost/freepdb1;charset=AL32UTF8'
    export PDO_OCI_TEST_USER=system
    export PDO_OCI_TEST_PASS=oracle

    cd /wherever/pecl-database-pdo_oci
    php /wherever/php-src/run-tests.php --set-timeout 600 ./tests
PK�C�\a�$}
}
 tests/oci_success_with_info.phptnu�[���--TEST--
Handling OCI_SUCCESS_WITH_INFO
--EXTENSIONS--
pdo
pdo_oci
--XFAIL--
This test frequently fails in CI
--SKIPIF--
<?php
if (getenv('SKIP_SLOW_TESTS')) die('skip slow tests excluded by request');
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$user = getenv('PDOTEST_USER');
if (strcasecmp($user, "system") && strcasecmp($user, "sys")) die("skip needs to be run as a DBA user");
PDOTest::skip();
?>
--FILE--
<?php
require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
function connectAsAdmin(): PDO {
    return PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');
}

function connectAsUser(string $username, string $password): PDO {
    return new PDO(getenv('PDOTEST_DSN'), $username, $password);
}

function dropProfile(PDO $conn): void {
    $conn->exec(<<<'SQL'
BEGIN
    EXECUTE IMMEDIATE 'DROP PROFILE BUG77120_PROFILE CASCADE';
EXCEPTION
    WHEN OTHERS THEN
        IF SQLCODE != -2380 THEN
            RAISE;
        END IF;
END;
SQL
    );
}

function dropUser(PDO $conn): void {
    $conn->exec(<<<'SQL'
BEGIN
    EXECUTE IMMEDIATE 'DROP USER BUG77120_USER CASCADE';
EXCEPTION
    WHEN OTHERS THEN
        IF SQLCODE != -1918 THEN
            RAISE;
        END IF;
END;
SQL
    );
}

function triggerCompilationError(PDO $conn): void {
    $conn->exec(<<<'SQL'
CREATE OR REPLACE FUNCTION BUG77120(INT A) RETURN INT
AS
BEGIN
    RETURN 0;
END;
SQL
    );
}

$conn = connectAsAdmin();

dropUser($conn);
dropProfile($conn);

$password = bin2hex(random_bytes(8));

$conn->exec('CREATE PROFILE BUG77120_PROFILE LIMIT PASSWORD_LIFE_TIME 1/86400 PASSWORD_GRACE_TIME 1');
$conn->exec('CREATE USER BUG77120_USER IDENTIFIED BY "' . $password . '" PROFILE BUG77120_PROFILE');
$conn->exec('GRANT CREATE SESSION TO BUG77120_USER');

// let the password expire
sleep(3); // 2 seconds is causing random test failures

$conn = connectAsUser('BUG77120_USER', $password);
var_dump($conn->errorInfo());

$conn = connectAsAdmin();
dropUser($conn);
dropProfile($conn);

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
triggerCompilationError($conn);
var_dump($conn->errorInfo());

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
triggerCompilationError($conn);
var_dump($conn->errorInfo());

?>
--EXPECTF--
array(3) {
  [0]=>
  string(5) "HY000"
  [1]=>
  int(28002)
  [2]=>
  string(%d) "OCISessionBegin: OCI_SUCCESS_WITH_INFO: ORA-%s
 (%s:%d)"
}
array(3) {
  [0]=>
  string(5) "HY000"
  [1]=>
  int(24344)
  [2]=>
  string(%d) "OCIStmtExecute: OCI_SUCCESS_WITH_INFO: ORA-24344: %s
 (%s:%d)"
}
array(3) {
  [0]=>
  string(5) "HY000"
  [1]=>
  int(24344)
  [2]=>
  string(%d) "OCIStmtExecute: OCI_SUCCESS_WITH_INFO: ORA-24344: %s
 (%s:%d)"
}
PK�C�\V�z�}}tests/pdo_oci_attr_action.phptnu�[���--TEST--
PDO_OCI: Attribute: Setting session action
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');

$query = 'select action from v$session where sid = sys_context(\'USERENV\', \'SID\')';

$dbh = PDOTest::factory();

$stmt = $dbh->query($query);
$row = $stmt->fetch();
echo 'ACTION NOT SET: ';
var_dump($row['action']);

var_dump($dbh->setAttribute(PDO::OCI_ATTR_ACTION, "some action"));

$stmt = $dbh->query($query);
$row = $stmt->fetch();
echo 'ACTION SET: ';
var_dump($row['action']);

var_dump($dbh->setAttribute(PDO::OCI_ATTR_ACTION, "something else!"));

$stmt = $dbh->query($query);
$row = $stmt->fetch();
echo 'ACTION RESET: ';
var_dump($row['action']);

var_dump($dbh->setAttribute(PDO::OCI_ATTR_ACTION, null));

$stmt = $dbh->query($query);
$row = $stmt->fetch();
echo 'ACTION NULLED: ';
var_dump($row['action']);

echo "Done\n";

?>
--EXPECT--
ACTION NOT SET: NULL
bool(true)
ACTION SET: string(11) "some action"
bool(true)
ACTION RESET: string(15) "something else!"
bool(true)
ACTION NULLED: NULL
Done
PK�C�\eD�xfftests/pdo_oci_attr_nulls_1.phptnu�[���--TEST--
PDO_OCI: Attribute: Oracle Nulls
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');

function do_query($dbh)
{
    var_dump($dbh->getAttribute(PDO::ATTR_ORACLE_NULLS));
    $s = $dbh->prepare("select '' as myempty, null as mynull from dual");
    $s->execute();
    while ($r = $s->fetch()) {
        var_dump($r[0]);
        var_dump($r[1]);
    }
}

$dbh = PDOTest::factory();

print "PDO::ATTR_ORACLE_NULLS: Default: ";
do_query($dbh);

print "PDO::ATTR_ORACLE_NULLS: PDO::NULL_NATURAL: ";
$dbh->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_NATURAL); // No conversion.

do_query($dbh);

print "PDO::ATTR_ORACLE_NULLS: PDO::NULL_EMPTY_STRING: ";
$dbh->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_EMPTY_STRING); // Empty string is converted to NULL.

do_query($dbh);

print "PDO::ATTR_ORACLE_NULLS: PDO::NULL_TO_STRING: ";
$dbh->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_TO_STRING); // NULL is converted to an empty string.

do_query($dbh);

echo "Done\n";

?>
--EXPECT--
PDO::ATTR_ORACLE_NULLS: Default: int(0)
NULL
NULL
PDO::ATTR_ORACLE_NULLS: PDO::NULL_NATURAL: int(0)
NULL
NULL
PDO::ATTR_ORACLE_NULLS: PDO::NULL_EMPTY_STRING: int(1)
NULL
NULL
PDO::ATTR_ORACLE_NULLS: PDO::NULL_TO_STRING: int(2)
string(0) ""
string(0) ""
Done
PK�C�\���|��tests/pecl_bug_11345.phptnu�[���--TEST--
PECL PDO_OCI Bug #11345 (Test invalid character set name)
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php

// This tests only part of PECL bug 11345.  The other part - testing
// when the National Language Support (NLS) environment can't be
// initialized - is very difficult to test portably.

try {
    $dbh = new PDO('oci:dbname=xxx;charset=yyy', 'abc', 'def');
}
catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage(). "\n";
    exit;
}

echo "Done\n";

?>
--EXPECTF--
Connection failed: SQLSTATE[HY000]: OCINlsCharSetNameToId: unknown character set name (%s)
PK�C�\�윙��"tests/pdo_oci_class_constants.phptnu�[���--TEST--
PDO OCI specific class constants
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');

$expected = [
    'OCI_ATTR_CLIENT_INFO'        => true,
    'OCI_ATTR_ACTION'             => true,
    'OCI_ATTR_CLIENT_IDENTIFIER'  => true,
    'OCI_ATTR_MODULE'             => true,
    'OCI_ATTR_CALL_TIMEOUT'       => true,
];

$ref = new ReflectionClass('PDO');
$constants = $ref->getConstants();
$values = [];

foreach ($constants as $name => $value) {
    if (substr($name, 0, 8) == 'OCI_ATTR') {
        if (!isset($values[$value])) {
            $values[$value] = [$name];
        } else {
            $values[$value][] = $name;
        }

        if (isset($expected[$name])) {
            unset($expected[$name]);
            unset($constants[$name]);
        }

        } else {
            unset($constants[$name]);
        }
}

if (!empty($constants)) {
    printf("[001] Dumping list of unexpected constants\n");
    var_dump($constants);
}

if (!empty($expected)) {
    printf("[002] Dumping list of missing constants\n");
    var_dump($expected);
}

if (!empty($values)) {
    foreach ($values as $value => $constants) {
        if (count($constants) > 1) {
            printf("[003] Several constants share the same value '%s'\n", $value);
            var_dump($constants);
        }
    }
}

print "done!";
?>
--EXPECT--
done!
PK�C�\lg��"tests/pdo_oci_attr_prefetch_1.phptnu�[���--TEST--
PDO_OCI: Attribute: Set prefetch on connection
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');

$dbh = PDOTest::factory();

echo "Test connect\n";
putenv('PDOTEST_ATTR='.serialize(array(PDO::ATTR_PREFETCH=>101)));
$dbh = PDOTest::factory();

echo $dbh->getAttribute(PDO::ATTR_PREFETCH), "\n";

// Verify can fetch
$s = $dbh->prepare("select dummy from dual" );
$s->execute();
while ($r = $s->fetch()) {
    echo $r[0] . "\n";
}

echo "Test set 102\n";
$dbh->setAttribute(PDO::ATTR_PREFETCH, 102);
echo $dbh->getAttribute(PDO::ATTR_PREFETCH), "\n";

// Verify can fetch
$s = $dbh->prepare("select dummy from dual" );
$s->execute();
while ($r = $s->fetch()) {
    echo $r[0] . "\n";
}

echo "Test set -1: (Uses 0)\n";
$dbh->setAttribute(PDO::ATTR_PREFETCH, -1);
echo $dbh->getAttribute(PDO::ATTR_PREFETCH), "\n";

// Verify can fetch
$s = $dbh->prepare("select dummy from dual" );
$s->execute();
while ($r = $s->fetch()) {
    echo $r[0] . "\n";
}

echo "Test set PHP_INT_MAX: (Uses default)\n";
$dbh->setAttribute(PDO::ATTR_PREFETCH, PHP_INT_MAX);
echo $dbh->getAttribute(PDO::ATTR_PREFETCH), "\n";

// Verify can fetch
$s = $dbh->prepare("select dummy from dual" );
$s->execute();
while ($r = $s->fetch()) {
    echo $r[0] . "\n";
}

echo "Done\n";

?>
--EXPECT--
Test connect
101
X
Test set 102
102
X
Test set -1: (Uses 0)
0
X
Test set PHP_INT_MAX: (Uses default)
100
X
Done
PK�C�\�XacNN)tests/pdo_oci_attr_client_identifier.phptnu�[���--TEST--
PDO_OCI: Attribute: Setting session client identifier
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');

$query = 'select client_identifier from v$session where sid = sys_context(\'USERENV\', \'SID\')';

$dbh = PDOTest::factory();

$stmt = $dbh->query($query);
$row = $stmt->fetch();
echo 'CLIENT_IDENTIFIER NOT SET: ';
var_dump($row['client_identifier']);

var_dump($dbh->setAttribute(PDO::OCI_ATTR_CLIENT_IDENTIFIER, "some client identifier"));

$stmt = $dbh->query($query);
$row = $stmt->fetch();
echo 'CLIENT_IDENTIFIER SET: ';
var_dump($row['client_identifier']);

var_dump($dbh->setAttribute(PDO::OCI_ATTR_CLIENT_IDENTIFIER, "something else!"));

$stmt = $dbh->query($query);
$row = $stmt->fetch();
echo 'CLIENT_IDENTIFIER RESET: ';
var_dump($row['client_identifier']);

var_dump($dbh->setAttribute(PDO::OCI_ATTR_CLIENT_IDENTIFIER, null));

$stmt = $dbh->query($query);
$row = $stmt->fetch();
echo 'CLIENT_IDENTIFIER NULLED: ';
var_dump($row['client_identifier']);

echo "Done\n";

?>
--EXPECT--
CLIENT_IDENTIFIER NOT SET: NULL
bool(true)
CLIENT_IDENTIFIER SET: string(22) "some client identifier"
bool(true)
CLIENT_IDENTIFIER RESET: string(15) "something else!"
bool(true)
CLIENT_IDENTIFIER NULLED: NULL
Done
PK�C�\Y�ktests/pdo_oci_attr_module.phptnu�[���--TEST--
PDO_OCI: Attribute: Setting session module
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php

require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');

$query = 'select module from v$session where sid = sys_context(\'USERENV\', \'SID\')';

$dbh = PDOTest::factory();

var_dump($dbh->setAttribute(PDO::OCI_ATTR_MODULE, "some module"));

$stmt = $dbh->query($query);
$row = $stmt->fetch();
echo 'MODULE SET: ';
var_dump($row['module']);

var_dump($dbh->setAttribute(PDO::OCI_ATTR_MODULE, "something else!"));

$stmt = $dbh->query($query);
$row = $stmt->fetch();
echo 'MODULE RESET: ';
var_dump($row['module']);

var_dump($dbh->setAttribute(PDO::OCI_ATTR_MODULE, null));

$stmt = $dbh->query($query);
$row = $stmt->fetch();
echo 'MODULE NULLED: ';
var_dump($row['module']);

echo "Done\n";

?>
--EXPECT--
bool(true)
MODULE SET: string(11) "some module"
bool(true)
MODULE RESET: string(15) "something else!"
bool(true)
MODULE NULLED: NULL
Done
PK�C�\�0��tests/bug46274.phptnu�[���--TEST--
Bug #46274 (pdo_pgsql - Segfault when using PDO::ATTR_STRINGIFY_FETCHES and blob)
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
PDOTest::skip();
?>
--FILE--
<?php
require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);

$db->exec("begin
             execute immediate 'drop table test46274';
             exception when others then
               if sqlcode <> -942 then
                 raise;
               end if;
           end;");

$db->beginTransaction();

$db->query('CREATE TABLE test46274 (id INT NOT NULL, blob1 BLOB)');

$stmt = $db->prepare("INSERT INTO test46274 (id, blob1) VALUES (:id, EMPTY_BLOB()) RETURNING blob1 INTO :foo");

$data = 'foo';
$blob = fopen('php://memory', 'a');
fwrite($blob, $data);
rewind($blob);

$id = 1;
$stmt->bindparam(':id', $id);
$stmt->bindparam(':foo', $blob, PDO::PARAM_LOB);
$stmt->execute();

$data = '';
$blob = fopen('php://memory', 'a');
fwrite($blob, $data);
rewind($blob);

$id = 1;
$stmt->bindparam(':id', $id);
$stmt->bindparam(':foo', $blob, PDO::PARAM_LOB);
$stmt->execute();

$res = $db->query("SELECT blob1 from test46274");
// Resource
var_dump($res->fetch());

// Empty string
var_dump($res->fetch());
?>
--CLEAN--
<?php
require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');
$db->exec("begin
             execute immediate 'drop table test46274';
             exception when others then
               if sqlcode <> -942 then
                 raise;
               end if;
           end;");
?>
--EXPECT--
array(2) {
  ["blob1"]=>
  string(3) "foo"
  [0]=>
  string(3) "foo"
}
array(2) {
  ["blob1"]=>
  string(0) ""
  [0]=>
  string(0) ""
}

PK�C�\w�TO��tests/common.phptnu�[���--TEST--
OCI
--EXTENSIONS--
pdo_oci
--REDIRECTTEST--
# magic auto-configuration

$config = array(
    'TESTS' => getenv('PDO_TEST_DIR')
);

putenv('ORA_SUPPRESS_ERROR_URL=TRUE');    // suppress Oracle Database 23ai error message URLs

if (false !== getenv('PDO_OCI_TEST_DSN')) {
    $config['ENV']['PDOTEST_DSN'] = getenv('PDO_OCI_TEST_DSN');
    $config['ENV']['PDOTEST_USER'] = getenv('PDO_OCI_TEST_USER');
    $config['ENV']['PDOTEST_PASS'] = getenv('PDO_OCI_TEST_PASS');
    $config['ENV']['PDOTEST_ATTR'] = getenv('PDO_OCI_TEST_ATTR');
} else {
    $config['ENV']['PDOTEST_DSN'] = 'oci:dbname=localhost/freepdb1;charset=AL32UTF8';
    $config['ENV']['PDOTEST_USER'] = 'system';
    $config['ENV']['PDOTEST_PASS'] = 'oracle';
}

return $config;
PK�C�\R��$tests/bug54379.phptnu�[���--TEST--
Bug #54379 (PDO_OCI: UTF-8 output gets truncated)
--EXTENSIONS--
pdo
pdo_oci
--SKIPIF--
<?php
require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
die('skip not UTF8 DSN');
PDOTest::skip();
?>
--FILE--
<?php
require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$db->exec("begin
             execute immediate 'drop table test54379';
             exception when others then
               if sqlcode <> -942 then
                 raise;
               end if;
           end;");
$db->exec("CREATE TABLE test54379 (col1 NVARCHAR2(20))");
$db->exec("INSERT INTO test54379 VALUES('12345678901234567890')");
$db->exec("INSERT INTO test54379 VALUES('あいうえおかきくけこさしすせそたちつてと')");
$stmt = $db->prepare("SELECT * FROM test54379");
$stmt->execute();
var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
?>
--CLEAN--
<?php
require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
$db = PDOTest::test_factory(getenv('PDO_OCI_TEST_DIR').'/common.phpt');
$db->exec("begin
             execute immediate 'drop table test54379';
             exception when others then
               if sqlcode <> -942 then
                 raise;
               end if;
           end;");
?>
--EXPECT--
array(2) {
  [0]=>
  array(1) {
    ["col1"]=>
    string(20) "12345678901234567890"
  }
  [1]=>
  array(1) {
    ["col1"]=>
    string(60) "あいうえおかきくけこさしすせそたちつてと"
  }
}
PK�C�\L�Crr$tests/pdo_oci_attr_call_timeout.phptnu�[���PK�C�\��%~""�tests/pecl_bug_6364.phptnu�[���PK�C�\)��p0tests/pdo_oci_stream_2.phptnu�[���PK�C�\��|Vgg${tests/pdo_oci_bind_input_output.phptnu�[���PK�C�\�ci��6!tests/pdo_oci_quote1.phptnu�[���PK�C�\H�A��\-tests/bug60994.phptnu�[���PK�C�\��9�	�	hEtests/pdo_oci_templob_1.phptnu�[���PK�C�\s��#�Otests/pdo_oci_attr_client_info.phptnu�[���PK�C�\2�����Ttests/pdo_oci_phpinfo.phptnu�[���PK�C�\,��$&Wtests/pdo_oci_attr_autocommit_2.phptnu�[���PK�C�\Mۀ��|htests/checkliveness.phptnu�[���PK�C�\Q�l�//Kmtests/pdo_oci_attr_case.phptnu�[���PK�C�\i_�$�ttests/pdo_oci_attr_autocommit_3.phptnu�[���PK�C�\P���WW1|tests/bug46274_2.phptnu�[���PK�C�\ u4)aä́tests/bug57702.phptnu�[���PK�C�\�*���q�tests/bug44301.phptnu�[���PK�C�\�������tests/pdo_oci_attr_client.phptnu�[���PK�C�\0����ɞtests/pdo_oci_fread_1.phptnu�[���PK�C�\��D{{"�tests/pdo_oci_attr_prefetch_2.phptnu�[���PK�C�\
Ʃ�kk"��tests/pdo_oci_attr_drivername.phptnu�[���PK�C�\9>����t�tests/pdo_oci_stream_1.phptnu�[���PK�C�\{���33��tests/pdo_oci_bind_bool.phptnu�[���PK�C�\?
�/<4<4%�tests/pdo_oci_stmt_getcolumnmeta.phptnu�[���PK�C�\�t�̉�$�tests/pdo_oci_attr_autocommit_1.phptnu�[���PK�C�\��TT"|
tests/pdo_oci_debugdumpparams.phptnu�[���PK�C�\���q''"tests/pdo_oci_attr_server.phptnu�[���PK�C�\�;����tests/bug41996.phptnu�[���PK�C�\�����tests/README.mdnu�[���PK�C�\a�$}
}
 �tests/oci_success_with_info.phptnu�[���PK�C�\V�z�}}�%tests/pdo_oci_attr_action.phptnu�[���PK�C�\eD�xff}*tests/pdo_oci_attr_nulls_1.phptnu�[���PK�C�\���|��20tests/pecl_bug_11345.phptnu�[���PK�C�\�윙��"3tests/pdo_oci_class_constants.phptnu�[���PK�C�\lg��"09tests/pdo_oci_attr_prefetch_1.phptnu�[���PK�C�\�XacNN)r?tests/pdo_oci_attr_client_identifier.phptnu�[���PK�C�\Y�kEtests/pdo_oci_attr_module.phptnu�[���PK�C�\�0��gItests/bug46274.phptnu�[���PK�C�\w�TO��*Qtests/common.phptnu�[���PK�C�\R��$XTtests/bug54379.phptnu�[���PK''
�Z