summaryrefslogtreecommitdiff
path: root/ext/pdo_oci/tests
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2013-03-14 05:42:27 +0000
committer <>2013-04-03 16:25:08 +0000
commitc4dd7a1a684490673e25aaf4fabec5df138854c4 (patch)
tree4d57c44caae4480efff02b90b9be86f44bf25409 /ext/pdo_oci/tests
downloadphp2-master.tar.gz
Imported from /home/lorry/working-area/delta_php2/php-5.4.13.tar.bz2.HEADphp-5.4.13master
Diffstat (limited to 'ext/pdo_oci/tests')
-rw-r--r--ext/pdo_oci/tests/bug41996.phpt20
-rw-r--r--ext/pdo_oci/tests/bug44301.phpt25
-rw-r--r--ext/pdo_oci/tests/bug46274.phpt73
-rw-r--r--ext/pdo_oci/tests/bug46274_2.phpt79
-rw-r--r--ext/pdo_oci/tests/bug57702.phpt165
-rw-r--r--ext/pdo_oci/tests/bug_33707.phpt29
-rw-r--r--ext/pdo_oci/tests/common.phpt26
-rw-r--r--ext/pdo_oci/tests/pdo_oci_attr_autocommit_1.phpt64
-rw-r--r--ext/pdo_oci/tests/pdo_oci_attr_autocommit_2.phpt127
-rw-r--r--ext/pdo_oci/tests/pdo_oci_attr_autocommit_3.phpt51
-rw-r--r--ext/pdo_oci/tests/pdo_oci_attr_case.phpt81
-rw-r--r--ext/pdo_oci/tests/pdo_oci_attr_client.phpt43
-rw-r--r--ext/pdo_oci/tests/pdo_oci_attr_drivername.phpt21
-rw-r--r--ext/pdo_oci/tests/pdo_oci_attr_nulls_1.phpt61
-rw-r--r--ext/pdo_oci/tests/pdo_oci_attr_prefetch_1.phpt37
-rw-r--r--ext/pdo_oci/tests/pdo_oci_attr_prefetch_2.phpt47
-rw-r--r--ext/pdo_oci/tests/pdo_oci_attr_server.phpt40
-rw-r--r--ext/pdo_oci/tests/pdo_oci_fread_1.phpt60
-rw-r--r--ext/pdo_oci/tests/pdo_oci_quote1.phpt163
-rw-r--r--ext/pdo_oci/tests/pdo_oci_stream_1.phpt113
-rw-r--r--ext/pdo_oci/tests/pecl_bug_11345.phpt29
-rw-r--r--ext/pdo_oci/tests/pecl_bug_6364.phpt71
22 files changed, 1425 insertions, 0 deletions
diff --git a/ext/pdo_oci/tests/bug41996.phpt b/ext/pdo_oci/tests/bug41996.phpt
new file mode 100644
index 0000000..ac8e35f
--- /dev/null
+++ b/ext/pdo_oci/tests/bug41996.phpt
@@ -0,0 +1,20 @@
+--TEST--
+PDO OCI Bug #41996 (Problem accessing Oracle ROWID)
+--SKIPIF--
+<?php
+/* $Id$ */
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require dirname(__FILE__).'/../../pdo/tests/pdo_test.inc';
+PDOTest::skip();
+?>
+--FILE--
+<?php
+require 'ext/pdo/tests/pdo_test.inc';
+$db = PDOTest::test_factory('ext/pdo_oci/tests/common.phpt');
+
+$stmt = $db->prepare('SELECT rowid FROM dual');
+$stmt->execute();
+$row = $stmt->fetch();
+var_dump(strlen($row[0]) > 0);
+--EXPECTF--
+bool(true)
diff --git a/ext/pdo_oci/tests/bug44301.phpt b/ext/pdo_oci/tests/bug44301.phpt
new file mode 100644
index 0000000..c0f7935
--- /dev/null
+++ b/ext/pdo_oci/tests/bug44301.phpt
@@ -0,0 +1,25 @@
+--TEST--
+PDO OCI Bug #44301 (Segfault when an exception is thrown on persistent connections)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require dirname(__FILE__).'/../../pdo/tests/pdo_test.inc';
+PDOTest::skip();
+?>
+--FILE--
+<?php
+putenv("PDO_OCI_TEST_ATTR=" . serialize(array(PDO::ATTR_PERSISTENT => true)));
+require 'ext/pdo/tests/pdo_test.inc';
+$db = PDOTest::test_factory('ext/pdo_oci/tests/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 does not exist
+ (%s/ext/pdo_oci/oci_statement.c:%d)
diff --git a/ext/pdo_oci/tests/bug46274.phpt b/ext/pdo_oci/tests/bug46274.phpt
new file mode 100644
index 0000000..77f2a01
--- /dev/null
+++ b/ext/pdo_oci/tests/bug46274.phpt
@@ -0,0 +1,73 @@
+--TEST--
+Bug #46274 (pdo_pgsql - Segfault when using PDO::ATTR_STRINGIFY_FETCHES and blob)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci'))
+die('skip not loaded');
+require dirname(__FILE__).'/../../pdo/tests/pdo_test.inc';
+PDOTest::skip();
+?>
+--FILE--
+<?php
+require 'ext/pdo/tests/pdo_test.inc';
+$db = PDOTest::test_factory('ext/pdo_oci/tests/common.phpt');
+$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
+
+try {
+ $db->exec("DROP TABLE test_one_blob");
+} catch (Exception $e) {
+}
+
+$db->beginTransaction();
+
+$db->query('CREATE TABLE test_one_blob (id INT NOT NULL, blob1 BLOB)');
+
+$stmt = $db->prepare("INSERT INTO test_one_blob (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 test_one_blob");
+// Resource
+var_dump($res->fetch());
+
+// Empty string
+var_dump($res->fetch());
+
+$db->exec("DROP TABLE test_one_blob");
+
+?>
+--XFAIL--
+Corrupts memory
+--EXPECTF--
+array(2) {
+ ["blob1"]=>
+ string(3) "foo"
+ [0]=>
+ string(3) "foo"
+}
+array(2) {
+ ["blob1"]=>
+ string(0) ""
+ [0]=>
+ string(0) ""
+}
diff --git a/ext/pdo_oci/tests/bug46274_2.phpt b/ext/pdo_oci/tests/bug46274_2.phpt
new file mode 100644
index 0000000..9e92254
--- /dev/null
+++ b/ext/pdo_oci/tests/bug46274_2.phpt
@@ -0,0 +1,79 @@
+--TEST--
+Bug #46274 (pdo_pgsql - Segfault when using PDO::ATTR_STRINGIFY_FETCHES and blob)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci'))
+die('skip not loaded');
+require dirname(__FILE__).'/../../pdo/tests/pdo_test.inc';
+PDOTest::skip();
+?>
+--FILE--
+<?php
+require 'ext/pdo/tests/pdo_test.inc';
+$db = PDOTest::test_factory('ext/pdo_oci/tests/common.phpt');
+$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
+
+try {
+ $db->exec("DROP TABLE test_one_blob");
+} catch (Exception $e) {
+}
+
+$db->beginTransaction();
+
+$db->query('CREATE TABLE test_one_blob (id INT NOT NULL, blob1 BLOB)');
+
+$stmt = $db->prepare("INSERT INTO test_one_blob (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 test_one_blob");
+// 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]);
+
+$db->exec("DROP TABLE test_one_blob");
+
+?>
+--XFAIL--
+Corrupts memory
+--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) ""
diff --git a/ext/pdo_oci/tests/bug57702.phpt b/ext/pdo_oci/tests/bug57702.phpt
new file mode 100644
index 0000000..9281f6d
--- /dev/null
+++ b/ext/pdo_oci/tests/bug57702.phpt
@@ -0,0 +1,165 @@
+--TEST--
+PDO OCI Bug #57702 (Multi-row BLOB fetches)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require(dirname(__FILE__).'/../../pdo/tests/pdo_test.inc');
+PDOTest::skip();
+?>
+--FILE--
+<?php
+
+require('ext/pdo/tests/pdo_test.inc');
+$db = PDOTest::test_factory('ext/pdo_oci/tests/common.phpt');
+
+// Note the PDO test setup sets PDO::ATTR_STRINGIFY_FETCHES to true
+// (and sets PDO::ATTR_CASE to PDO::CASE_LOWER)
+
+$query = "begin execute immediate 'drop table mytable'; exception when others then if sqlcode <> -942 then raise; end if; end;";
+$stmt = $db->prepare($query);
+$stmt->execute();
+
+$query = "create table bug57702 (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 bug57702 (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 bug57702 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 bug57702 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 bug57702 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);
+}
+print "done\n";
+
+////////////////////
+
+echo "\nFourth Query\n";
+
+$a = array();
+$i = 0;
+foreach($db->query("select data1 as d4_1, data2 as d4_2 from bug57702 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 bug57702 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]));
+}
+
+// Cleanup
+$query = "drop table bug57702";
+$stmt = $db->prepare($query);
+$stmt->execute();
+
+print "done\n";
+
+?>
+--EXPECTF--
+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"
+done
+
+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"
+done
diff --git a/ext/pdo_oci/tests/bug_33707.phpt b/ext/pdo_oci/tests/bug_33707.phpt
new file mode 100644
index 0000000..1ac9fa4
--- /dev/null
+++ b/ext/pdo_oci/tests/bug_33707.phpt
@@ -0,0 +1,29 @@
+--TEST--
+PDO OCI Bug #33707 (Errors in select statements not reported)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require dirname(__FILE__).'/../../pdo/tests/pdo_test.inc';
+PDOTest::skip();
+?>
+--FILE--
+<?php
+require 'ext/pdo/tests/pdo_test.inc';
+$db = PDOTest::test_factory('ext/pdo_oci/tests/common.phpt');
+$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
+
+$rs = $db->query('select blah from a_table_that_doesnt_exist');
+var_dump($rs);
+var_dump($db->errorInfo());
+
+--EXPECTF--
+bool(false)
+array(3) {
+ [0]=>
+ string(5) "HY000"
+ [1]=>
+ int(942)
+ [2]=>
+ string(%d) "OCIStmtExecute: ORA-00942: table or view does not exist
+ (%s:%d)"
+}
diff --git a/ext/pdo_oci/tests/common.phpt b/ext/pdo_oci/tests/common.phpt
new file mode 100644
index 0000000..5107828
--- /dev/null
+++ b/ext/pdo_oci/tests/common.phpt
@@ -0,0 +1,26 @@
+--TEST--
+OCI
+--SKIPIF--
+<?php # vim:ft=php
+if (!extension_loaded('pdo_oci')) print 'skip'; ?>
+--REDIRECTTEST--
+# magic auto-configuration
+
+$config = array(
+ 'TESTS' => 'ext/pdo/tests'
+);
+
+
+if (false !== getenv('PDO_OCI_TEST_DSN')) {
+ # user set them from their shell
+ $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/xe;charset=WE8MSWIN1252';
+ $config['ENV']['PDOTEST_USER'] = 'SYSTEM';
+ $config['ENV']['PDOTEST_PASS'] = 'oracle';
+}
+
+return $config;
diff --git a/ext/pdo_oci/tests/pdo_oci_attr_autocommit_1.phpt b/ext/pdo_oci/tests/pdo_oci_attr_autocommit_1.phpt
new file mode 100644
index 0000000..298d59e
--- /dev/null
+++ b/ext/pdo_oci/tests/pdo_oci_attr_autocommit_1.phpt
@@ -0,0 +1,64 @@
+--TEST--
+PDO_OCI: Attribute: Basic autocommit functionality
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require(dirname(__FILE__).'/../../pdo/tests/pdo_test.inc');
+PDOTest::skip();
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc');
+
+$dbh = PDOTest::factory();
+
+$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
+$dbh->exec("drop table pdo_ac_tab");
+$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("create table pdo_ac_tab (col1 varchar2(20))");
+$dbh->exec("insert into pdo_ac_tab (col1) values ('some data')");
+
+$dbh2 = PDOTest::factory();
+
+echo "Second connection should be able to see committed data\n";
+$s = $dbh2->prepare("select col1 from pdo_ac_tab");
+$s->execute();
+while ($r = $s->fetch()) {
+ echo "Data is: " . $r[0] . "\n";
+}
+
+$dbh->exec("drop table pdo_ac_tab");
+
+echo "Done\n";
+
+?>
+--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 \ No newline at end of file
diff --git a/ext/pdo_oci/tests/pdo_oci_attr_autocommit_2.phpt b/ext/pdo_oci/tests/pdo_oci_attr_autocommit_2.phpt
new file mode 100644
index 0000000..9addca8
--- /dev/null
+++ b/ext/pdo_oci/tests/pdo_oci_attr_autocommit_2.phpt
@@ -0,0 +1,127 @@
+--TEST--
+PDO_OCI: Attribute: beginTransaction and native transactions
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require(dirname(__FILE__).'/../../pdo/tests/pdo_test.inc');
+PDOTest::skip();
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc');
+$dbh = PDOTest::factory();
+
+$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
+$dbh->exec("drop table pdo_ac_tab");
+$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+$dbh->exec("create table pdo_ac_tab (col1 varchar2(25))");
+
+echo "Test 1 Check beginTransaction insertion\n";
+
+$dbh->beginTransaction();
+try {
+ $dbh->exec("insert into pdo_ac_tab (col1) values ('data 1')");
+ $dbh->exec("insert into pdo_ac_tab (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 pdo_ac_tab (col1) values ('not committed #1')");
+ $dbh->exec("insert into pdo_ac_tab (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 pdo_ac_tab (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 pdo_ac_tab (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 pdo_ac_tab (col1) values ('not committed #2')");
+$dbh->exec("rollback");
+$dbh->exec("insert into pdo_ac_tab (col1) values ('data 5')");
+$dbh->exec("insert into pdo_ac_tab (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 pdo_ac_tab");
+$s->execute();
+while ($r = $s->fetch()) {
+ echo $r[0] . "\n";
+}
+
+echo "Done\n";
+
+?>
+--EXPECTF--
+Test 1 Check beginTransaction insertion
+Test 2 Cause an exception and test beginTransaction rollback
+Caught expected exception at line 35
+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
diff --git a/ext/pdo_oci/tests/pdo_oci_attr_autocommit_3.phpt b/ext/pdo_oci/tests/pdo_oci_attr_autocommit_3.phpt
new file mode 100644
index 0000000..81e9b74
--- /dev/null
+++ b/ext/pdo_oci/tests/pdo_oci_attr_autocommit_3.phpt
@@ -0,0 +1,51 @@
+--TEST--
+PDO_OCI: Atrribute: closing a connection in non-autocommit mode commits data
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require(dirname(__FILE__).'/../../pdo/tests/pdo_test.inc');
+PDOTest::skip();
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__) . '/../../pdo/tests/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_SILENT);
+$dbh->exec("drop table pdo_ac_tab");
+
+$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("create table pdo_ac_tab (col1 varchar2(20))");
+
+$dbh->exec("insert into pdo_ac_tab (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 pdo_ac_tab");
+$s->execute();
+while ($r = $s->fetch()) {
+ echo "Data is: " . $r[0] . "\n";
+}
+
+$dbh2->exec("drop table pdo_ac_tab");
+
+echo "Done\n";
+
+?>
+--EXPECTF--
+PDO::ATTR_AUTOCOMMIT: bool(false)
+Insert data
+Second connection should be able to see committed data
+Done
diff --git a/ext/pdo_oci/tests/pdo_oci_attr_case.phpt b/ext/pdo_oci/tests/pdo_oci_attr_case.phpt
new file mode 100644
index 0000000..4c19d6c
--- /dev/null
+++ b/ext/pdo_oci/tests/pdo_oci_attr_case.phpt
@@ -0,0 +1,81 @@
+--TEST--
+PDO_OCI: Attribute: Column Case
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require(dirname(__FILE__).'/../../pdo/tests/pdo_test.inc');
+PDOTest::skip();
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__) . '/../../pdo/tests/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
diff --git a/ext/pdo_oci/tests/pdo_oci_attr_client.phpt b/ext/pdo_oci/tests/pdo_oci_attr_client.phpt
new file mode 100644
index 0000000..372ccec
--- /dev/null
+++ b/ext/pdo_oci/tests/pdo_oci_attr_client.phpt
@@ -0,0 +1,43 @@
+--TEST--
+PDO_OCI: Attribute: Client version
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require(dirname(__FILE__).'/../../pdo/tests/pdo_test.inc');
+PDOTest::skip();
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc');
+
+$dbh = PDOTest::factory();
+
+echo "ATTR_CLIENT_VERSION: ";
+$cv = $dbh->getAttribute(PDO::ATTR_CLIENT_VERSION);
+var_dump($cv);
+
+$s = explode(".", $cv);
+if ($s[0] >= 10 && count($s) > 1 && $s[1] >= 2) {
+ 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
diff --git a/ext/pdo_oci/tests/pdo_oci_attr_drivername.phpt b/ext/pdo_oci/tests/pdo_oci_attr_drivername.phpt
new file mode 100644
index 0000000..7934e79
--- /dev/null
+++ b/ext/pdo_oci/tests/pdo_oci_attr_drivername.phpt
@@ -0,0 +1,21 @@
+--TEST--
+PDO_OCI: Attribute: verify driver name
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require(dirname(__FILE__).'/../../pdo/tests/pdo_test.inc');
+PDOTest::skip();
+?>
+--FILE--
+<?php
+
+require dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc';
+
+$dbh = PDOTest::factory();
+var_dump($dbh->getAttribute(PDO::ATTR_DRIVER_NAME));
+
+echo "Done\n";
+?>
+--EXPECT--
+string(3) "oci"
+Done
diff --git a/ext/pdo_oci/tests/pdo_oci_attr_nulls_1.phpt b/ext/pdo_oci/tests/pdo_oci_attr_nulls_1.phpt
new file mode 100644
index 0000000..b9c4612
--- /dev/null
+++ b/ext/pdo_oci/tests/pdo_oci_attr_nulls_1.phpt
@@ -0,0 +1,61 @@
+--TEST--
+PDO_OCI: Attribute: Oracle Nulls
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require(dirname(__FILE__).'/../../pdo/tests/pdo_test.inc');
+PDOTest::skip();
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__) . '/../../pdo/tests/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 \ No newline at end of file
diff --git a/ext/pdo_oci/tests/pdo_oci_attr_prefetch_1.phpt b/ext/pdo_oci/tests/pdo_oci_attr_prefetch_1.phpt
new file mode 100644
index 0000000..839fe83
--- /dev/null
+++ b/ext/pdo_oci/tests/pdo_oci_attr_prefetch_1.phpt
@@ -0,0 +1,37 @@
+--TEST--
+PDO_OCI: Attribute: Set prefetch on connection
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require(dirname(__FILE__).'/../../pdo/tests/pdo_test.inc');
+PDOTest::skip();
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc');
+
+$dbh = PDOTest::factory();
+
+echo "Test connect: (value is ignored & has no effect)\n";
+putenv('PDOTEST_ATTR='.serialize(array(PDO::ATTR_PREFETCH=>101)));
+$dbh = PDOTest::factory();
+
+echo "Test set: (value is ignored & has no effect)\n";
+$dbh->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 "Done\n";
+
+?>
+--EXPECT--
+Test connect: (value is ignored & has no effect)
+Test set: (value is ignored & has no effect)
+X
+Done
diff --git a/ext/pdo_oci/tests/pdo_oci_attr_prefetch_2.phpt b/ext/pdo_oci/tests/pdo_oci_attr_prefetch_2.phpt
new file mode 100644
index 0000000..4b8fd80
--- /dev/null
+++ b/ext/pdo_oci/tests/pdo_oci_attr_prefetch_2.phpt
@@ -0,0 +1,47 @@
+--TEST--
+PDO_OCI: Attribute: prefetch on statements
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require(dirname(__FILE__).'/../../pdo/tests/pdo_test.inc');
+PDOTest::skip();
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__) . '/../../pdo/tests/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
diff --git a/ext/pdo_oci/tests/pdo_oci_attr_server.phpt b/ext/pdo_oci/tests/pdo_oci_attr_server.phpt
new file mode 100644
index 0000000..dba5a19
--- /dev/null
+++ b/ext/pdo_oci/tests/pdo_oci_attr_server.phpt
@@ -0,0 +1,40 @@
+--TEST--
+PDO_OCI: Attribute: Server version and info
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require(dirname(__FILE__).'/../../pdo/tests/pdo_test.inc');
+PDOTest::skip();
+?>
+--FILE--
+<?php
+
+require(dirname(__FILE__) . '/../../pdo/tests/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
diff --git a/ext/pdo_oci/tests/pdo_oci_fread_1.phpt b/ext/pdo_oci/tests/pdo_oci_fread_1.phpt
new file mode 100644
index 0000000..26a92f0
--- /dev/null
+++ b/ext/pdo_oci/tests/pdo_oci_fread_1.phpt
@@ -0,0 +1,60 @@
+--TEST--
+PDO_OCI: check fread() EOF
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require(dirname(__FILE__).'/../../pdo/tests/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(dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc');
+
+$dbh = PDOTest::factory();
+
+$dbh->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
+
+// Initialization
+$stmtarray = array(
+ "begin execute immediate 'drop table pdo_oci_fread_tab'; exception when others then null; end;",
+ "create table pdo_oci_fread_tab (id number, data clob)",
+ "declare
+ lob1 clob := 'abc' || lpad('j',4020,'j') || 'xyz';
+ begin
+ insert into pdo_oci_fread_tab (id,data) values (1, lob1);
+ end;"
+);
+
+foreach ($stmtarray as $stmt) {
+ $dbh->exec($stmt);
+}
+
+echo "Test 1\n";
+
+$s = $dbh->query("select data from pdo_oci_fread_tab where id = 1");
+$r = $s->fetch();
+$sh = $r['data'];
+
+while (!feof($sh)) {
+ $buffer = fread($sh,1024);
+ echo '*'.$buffer.'*';
+}
+echo "\n";
+fclose($sh);
+
+// Clean up
+
+$stmtarray = array(
+ "drop table pdo_oci_fread_tab"
+);
+
+foreach ($stmtarray as $stmt) {
+ $dbh->exec($stmt);
+}
+
+?>
+--EXPECTF--
+Test 1
+*abcjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj**jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj**jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj**jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjxyz*
diff --git a/ext/pdo_oci/tests/pdo_oci_quote1.phpt b/ext/pdo_oci/tests/pdo_oci_quote1.phpt
new file mode 100644
index 0000000..d92317f
--- /dev/null
+++ b/ext/pdo_oci/tests/pdo_oci_quote1.phpt
@@ -0,0 +1,163 @@
+--TEST--
+Test PDO->quote() for PDO_OCI
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require(dirname(__FILE__).'/../../pdo/tests/pdo_test.inc');
+PDOTest::skip();
+?>
+--FILE--
+<?php
+
+require dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc';
+$db = PDOTest::factory();
+
+@$db->exec("drop table poq_tab");
+$db->query("create table poq_tab (t varchar2(100))");
+$stmt = $db->prepare('select * from poq_tab');
+
+// The intent is that the fetched data be identical to the unquoted string.
+// Remember!: use bind variables instead of PDO->quote()
+
+$a = array(null, "", "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 poq_tab");
+
+ $db->query("insert into poq_tab (t) values($q)");
+ $stmt->execute();
+ var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
+}
+
+echo "Done\n";
+
+@$db->exec("drop table poq_tab");
+
+?>
+--EXPECTF--
+Unquoted : NULL
+Quoted : string(2) "''"
+array(1) {
+ [0]=>
+ array(1) {
+ ["t"]=>
+ NULL
+ }
+}
+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
diff --git a/ext/pdo_oci/tests/pdo_oci_stream_1.phpt b/ext/pdo_oci/tests/pdo_oci_stream_1.phpt
new file mode 100644
index 0000000..27a28b9
--- /dev/null
+++ b/ext/pdo_oci/tests/pdo_oci_stream_1.phpt
@@ -0,0 +1,113 @@
+--TEST--
+PDO_OCI: stream_get_contents length & offset test
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require(dirname(__FILE__).'/../../pdo/tests/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(dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc');
+
+$dbh = PDOTest::factory();
+
+$dbh->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
+
+// Initialization
+@$dbh->exec("drop table pdo_oci_stream_1_tab");
+
+$stmtarray = array(
+ "create table pdo_oci_stream_1_tab (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 pdo_oci_stream_1_tab (id,data) values (1, 'abcdefghijklmnopqrstuvwxyz');
+ insert into pdo_oci_stream_1_tab (id,data) values (2, lob1);
+ end;");
+
+echo "Test 1\n";
+
+$s = $dbh->prepare("select data from pdo_oci_stream_1_tab 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 pdo_oci_stream_1_tab 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 up
+
+$stmtarray = array(
+ "drop table pdo_oci_stream_1_tab"
+);
+
+foreach ($stmtarray as $stmt) {
+ $dbh->exec($stmt);
+}
+
+?>
+--EXPECTF--
+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 \ No newline at end of file
diff --git a/ext/pdo_oci/tests/pecl_bug_11345.phpt b/ext/pdo_oci/tests/pecl_bug_11345.phpt
new file mode 100644
index 0000000..b80773a
--- /dev/null
+++ b/ext/pdo_oci/tests/pecl_bug_11345.phpt
@@ -0,0 +1,29 @@
+--TEST--
+PECL PDO_OCI Bug #11345 (Test invalid character set name)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require(dirname(__FILE__).'/../../pdo/tests/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) \ No newline at end of file
diff --git a/ext/pdo_oci/tests/pecl_bug_6364.phpt b/ext/pdo_oci/tests/pecl_bug_6364.phpt
new file mode 100644
index 0000000..b2981ec
--- /dev/null
+++ b/ext/pdo_oci/tests/pecl_bug_6364.phpt
@@ -0,0 +1,71 @@
+--TEST--
+PECL PDO_OCI Bug #6364 (segmentation fault on stored procedure call with OUT binds)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_oci')) die('skip not loaded');
+require(dirname(__FILE__).'/../../pdo/tests/pdo_test.inc');
+PDOTest::skip();
+?>
+--FILE--
+<?php
+
+require dirname(__FILE__) . '/../../pdo/tests/pdo_test.inc';
+$dbh = PDOTest::factory();
+
+@$dbh->exec ("drop table bug_6364_t");
+
+$dbh->exec ("create table bug_6364_t (c1 varchar2(10), c2 varchar2(10), c3 varchar2(10), c4 varchar2(10), c5 varchar2(10))");
+
+$dbh->exec ("create or replace procedure bug_6364_sp(p1 IN varchar2, p2 IN varchar2, p3 IN varchar2, p4 OUT varchar2, p5 OUT varchar2) as begin insert into bug_6364_t (c1, c2, c3) values (p1, p2, p3); p4 := 'val4'; p5 := 'val5'; end;");
+
+$stmt = $dbh->prepare("call bug_6364_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 bug_6364_t") as $row) {
+ var_dump($row);
+}
+
+print "Done\n";
+
+// Cleanup
+$dbh->exec ("drop procedure bug_6364_sp");
+$dbh->exec ("drop table bug_6364_t");
+
+?>
+
+--EXPECTF--
+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