diff options
Diffstat (limited to 'ext/pdo_oci/tests')
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 |