Merge pull request #354 from v-kaywon/cover_pdo_dbh

increase coverage for pdo_dbh.cpp
This commit is contained in:
Jenny Tam 2017-04-13 14:55:31 -07:00 committed by GitHub
commit 012b16a64f
20 changed files with 1218 additions and 0 deletions

View file

@ -0,0 +1,49 @@
--TEST--
Test PDO::__Construct connection option TransactionIsolation
--SKIPIF--
--FILE--
<?php
function Connect($value) {
require("autonomous_setup.php");
$database = "tempdb";
$dsn = "sqlsrv:Server = $serverName;" .
"Database = $database;" .
"TransactionIsolation = $value";
$conn = new PDO( $dsn, $username, $password );
$conn = NULL;
echo "Test Successful\n";
}
// TEST BEGIN
try {
Connect("READ_UNCOMMITTED");
Connect("READ_COMMITTED");
Connect("REPEATABLE_READ");
Connect("SNAPSHOT");
Connect("SERIALIZABLE");
Connect("INVALID_KEY");
echo "Test Successful";
}
catch( PDOException $e ) {
var_dump( $e->errorInfo );
exit;
}
?>
--EXPECT--
Test Successful
Test Successful
Test Successful
Test Successful
Test Successful
array(3) {
[0]=>
string(5) "IMSSP"
[1]=>
int(-63)
[2]=>
string(88) "An invalid value was specified for the keyword 'TransactionIsolation' in the DSN string."
}

View file

@ -0,0 +1,53 @@
--TEST--
Test PDO::__Construct by passing different connection attributes
--SKIPIF--
--FILE--
<?php
require_once("autonomous_setup.php");
try
{
$attr = array( PDO::SQLSRV_ATTR_ENCODING => 3,
PDO::ATTR_CASE => 2,
PDO::ATTR_PREFETCH => false,
PDO::ATTR_TIMEOUT => 35,
PDO::ATTR_STRINGIFY_FETCHES => true,
PDO::SQLSRV_ATTR_DIRECT_QUERY => true,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
PDO::SQLSRV_ATTR_CLIENT_BUFFER_MAX_KB_SIZE => 10240,
PDO::SQLSRV_ATTR_DIRECT_QUERY => true
);
$database = "tempdb";
$dsn = "sqlsrv:Server = $serverName; Database = $database";
$conn = new PDO( $dsn, $username, $password, $attr);
$stmt = $conn->prepare("SELECT 1");
$stmt->execute();
// fetch result, which should be stringified since ATTR_STRINGIFY_FETCHES is on
var_dump(($stmt->fetch(PDO::FETCH_ASSOC)));
$stmt = NULL;
$conn = NULL;
echo "Test Successful";
}
catch( PDOException $e ) {
var_dump( $e );
exit;
}
?>
--EXPECT--
array(1) {
[""]=>
string(1) "1"
}
Test Successful

View file

@ -0,0 +1,42 @@
--TEST--
Test PDO::__Construct by passing connection options
--SKIPIF--
--FILE--
<?php
require_once("autonomous_setup.php");
try
{
$database = "tempdb";
$dsn = "sqlsrv:Server = $serverName;" .
"ConnectionPooling = false;" .
"APP = whatever;" .
"LoginTimeout = 1;" .
"ApplicationIntent = ReadOnly;" .
"Database = $database;" .
"Encrypt = false;" .
"Failover_Partner = whatever;" .
"MultipleActiveResultSets = true;" .
"MultiSubnetFailover = NO;" .
"QuotedId = false;" .
"TraceFile = whatever;" .
"TraceOn = true;" .
"TrustServerCertificate = false;" .
"WSID = whatever;"
;
$conn = new PDO( $dsn, $username, $password);
echo "Test Successful";
}
catch( PDOException $e ) {
var_dump( $e );
exit;
}
?>
--EXPECT--
Test Successful

View file

@ -0,0 +1,123 @@
--TEST--
Test PDO::__Construct with incorrectly formatted DSN or no Server specified in DSN
--SKIPIF--
--FILE--
<?php
require_once("autonomous_setup.php");
/*----------Connection option cases that raises errors----------*/
//dsn with 2 consecutive semicolons
try
{
$conn = new PDO( "sqlsrv:Server = $serverName;;", $username, $password );
}
catch( PDOException $e ) {
print_r( ($e->errorInfo)[2] );
echo "\n";
}
//dsn with double right curly braces
try
{
$conn = new PDO( "sqlsrv:Server =$serverName; Database = {tempdb}}", $username, $password );
}
catch( PDOException $e ) {
print_r( ($e->errorInfo)[2] );
echo "\n";
}
//dsn with double right curly braces and semicolon
try
{
$conn = new PDO( "sqlsrv:Server =$serverName; Database = {tempdb}};", $username, $password );
}
catch( PDOException $e ) {
print_r( ($e->errorInfo)[2] );
echo "\n";
}
//dsn with right curly braces and other symbol
try
{
$conn = new PDO( "sqlsrv:Server =$serverName; Database = {tempdb}?", $username, $password );
}
catch( PDOException $e ) {
print_r( ($e->errorInfo)[2] );
echo "\n";
}
//dsn with no equal sign in one option
try
{
$conn = new PDO( "sqlsrv:Server =$serverName; Database", $username, $password );
}
catch( PDOException $e ) {
print_r( ($e->errorInfo)[2] );
echo "\n";
}
//dsn with no keys
try
{
// Try to connect with no server specific
@$conn = new PDO( "sqlsrv:", $username, $password );
}
catch( PDOException $e ) {
print_r( ($e->errorInfo)[2] );
echo "\n";
}
// Try to connect with no server specified
try
{
$database = "tempdb";
@$conn = new PDO( "sqlsrv:Database = $database", $username, $password );
}
catch( PDOException $e ) {
print_r( ($e->errorInfo)[2] );
echo "\n";
}
echo "\n";
/*----------Connection option cases that is OK----------*/
try
{
//dsn with curly braces
$conn = new PDO( "sqlsrv:Server =$serverName; Database = {tempdb}", $username, $password );
echo "value in curly braces OK\n";
//dsn with curly braces and semicolon
@$conn = new PDO( "sqlsrv:Server =$serverName; Database = {tempdb};", $username, $password );
echo "value in curly braces followed by a semicolon OK\n";
//dsn with curly braces and trailing spaces
@$conn = new PDO( "sqlsrv:Server =$serverName; Database = {tempdb} ", $username, $password );
echo "value in curly braces followed by trailing spaces OK\n";
//dsn with no value specified and ends with semicolon
$conn = new PDO( "sqlsrv:Server =$serverName; Database = ;", $username, $password );
echo "dsn with no value specified and ends with semicolon OK\n";
}
catch( PDOException $e ) {
print_r( ($e->errorInfo)[2] );
}
?>
--EXPECTREGEX--
An extra semi-colon was encountered in the DSN string at character \(byte-count\) position '[0-9]+' \.
An unescaped right brace \(\}\) was found in the DSN string for keyword 'Database'\. All right braces must be escaped with another right brace \(\}\}\)\.
An expected right brace \(\}\) was not found in the DSN string for the value of the keyword 'Database'\.
An invalid value was specified for the keyword 'Database' in the DSN string\.
The DSN string ended unexpectedly\.
An invalid DSN string was specified\.
Server keyword was not specified in the DSN string\.
value in curly braces OK
value in curly braces followed by a semicolon OK
value in curly braces followed by trailing spaces OK
dsn with no value specified and ends with semicolon OK

View file

@ -0,0 +1,29 @@
--TEST--
direct execution of an invalid query
--SKIPIF--
--FILE--
<?php
require_once("autonomous_setup.php");
$conn = new PDO( "sqlsrv:Server=$serverName; Database = tempdb ", $username, $password);
$conn->exec("IF OBJECT_ID('table1', 'U') IS NOT NULL DROP TABLE table1");
// execute a query with typo (spelling error in CREATE)
$conn->exec("CRETE TABLE table1(id INT NOT NULL PRIMARY KEY, val VARCHAR(10)) ");
print_r( $conn->errorCode() );
echo "\n";
// execute a properly formatted query
$conn->exec("CREATE TABLE table1(id INT NOT NULL PRIMARY KEY, val VARCHAR(10)) ");
print_r( $conn->errorCode() );
echo "\n";
// drop table1 and free connections
$conn->exec("DROP TABLE table1");
$conn = NULL;
?>
--EXPECT--
42000
00000

View file

@ -0,0 +1,38 @@
--TEST--
Test getting invalid attributes
--SKIPIF--
--FILE--
<?php
require_once("autonomous_setup.php");
try{
$database = "tempdb";
$dsn = "sqlsrv:Server = $serverName; Database = $database";
$conn = new PDO( $dsn, $username, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT));
@$conn->getAttribute( PDO::ATTR_FETCH_TABLE_NAMES );
print_r (($conn->errorInfo())[2]);
echo "\n";
@$conn->getAttribute( PDO::ATTR_CURSOR );
print_r (($conn->errorInfo())[2]);
echo "\n";
@$conn->getAttribute( PDO::ATTR_CONNECTION_STATUS );
print_r (($conn->errorInfo())[2]);
echo "\n";
}
catch ( PDOException $e ){
exit;
}
?>
--EXPECT--
An unsupported attribute was designated on the PDO object.
The given attribute is only supported on the PDOStatement object.
An invalid attribute was designated on the PDO object.

View file

@ -0,0 +1,223 @@
--TEST--
Test PDO::setAttribute() and PDO::getAttribute() methods.
--SKIPIF--
--FILE--
<?php
require_once("autonomous_setup.php");
// A custom PDO statement class to test PDO::ATTR_STATEMENT_CLASS
class CustomPDOStatement extends PDOStatement
{
protected function __construct() {
}
}
function get_attr( $conn, $attr )
{
try {
echo "Get Result $attr :\n";
$result = $conn->getAttribute( constant($attr) );
var_dump( $result);
}
catch ( PDOException $e)
{
echo $e->getMessage() . "\n";
}
}
function set_attr( $conn, $attr, $val )
{
try {
echo "Set Result $attr :\n";
$result = $conn->setAttribute( constant($attr), $val );
var_dump( $result);
}
catch ( PDOException $e)
{
echo $e->getMessage() . "\n";
}
}
function set_get_attr($testName, $conn, $attr, $val)
{
try {
echo "\n". $testName . ":\n";
set_attr($conn, $attr, $val );
get_attr($conn, $attr );
}
catch(PDOException $e)
{
var_dump($e);
}
}
try
{
$database = "tempdb";
$conn = new PDO("sqlsrv:Server=$serverName;Database=$database", $username, $password);
$values = array ( "PDO::ATTR_ERRMODE" => 2,
"PDO::ATTR_SERVER_VERSION" => "whatever",
"PDO::ATTR_DRIVER_NAME" => "whatever",
"PDO::ATTR_STRINGIFY_FETCHES" => true,
"PDO::ATTR_CLIENT_VERSION" => "whatever",
"PDO::ATTR_SERVER_INFO" => "whatever",
"PDO::ATTR_CASE" => PDO::CASE_LOWER,
"PDO::SQLSRV_ATTR_ENCODING" => PDO::SQLSRV_ENCODING_SYSTEM,
"PDO::ATTR_DEFAULT_FETCH_MODE" => PDO::FETCH_ASSOC,
"PDO::ATTR_ORACLE_NULLS" => PDO::NULL_NATURAL,
"PDO::SQLSRV_ATTR_CLIENT_BUFFER_MAX_KB_SIZE" => 5120,
"PDO::SQLSRV_ATTR_DIRECT_QUERY" => true,
"PDO::ATTR_STATEMENT_CLASS" => array('CustomPDOStatement', array()),
"PDO::SQLSRV_ATTR_QUERY_TIMEOUT" => 10,
"PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE" => false
);
$attributes = array ( "PDO::ATTR_ERRMODE",
"PDO::ATTR_SERVER_VERSION",
"PDO::ATTR_DRIVER_NAME",
"PDO::ATTR_STRINGIFY_FETCHES",
"PDO::ATTR_CLIENT_VERSION",
"PDO::ATTR_SERVER_INFO",
"PDO::ATTR_CASE",
"PDO::SQLSRV_ATTR_ENCODING",
"PDO::ATTR_DEFAULT_FETCH_MODE",
"PDO::ATTR_ORACLE_NULLS",
"PDO::SQLSRV_ATTR_CLIENT_BUFFER_MAX_KB_SIZE",
"PDO::SQLSRV_ATTR_DIRECT_QUERY",
"PDO::ATTR_STATEMENT_CLASS",
"PDO::SQLSRV_ATTR_QUERY_TIMEOUT",
"PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE"
);
$i = 1;
foreach( $attributes as $attr )
{
$testName = "Test_". $i;
$i = $i + 1;
set_get_attr($testName, $conn, $attr, $values[$attr]);
}
}
catch( PDOException $e ) {
var_dump( $e );
exit;
}
?>
--EXPECTREGEX--
Test_1:
Set Result PDO::ATTR_ERRMODE :
bool\(true\)
Get Result PDO::ATTR_ERRMODE :
int\(2\)
Test_2:
Set Result PDO::ATTR_SERVER_VERSION :
SQLSTATE\[IMSSP\]: A read-only attribute was designated on the PDO object.
Get Result PDO::ATTR_SERVER_VERSION :
string\([0-9]*\) "[0-9]{2}.[0-9]{2}.[0-9]{4}"
Test_3:
Set Result PDO::ATTR_DRIVER_NAME :
SQLSTATE\[IMSSP\]: A read-only attribute was designated on the PDO object.
Get Result PDO::ATTR_DRIVER_NAME :
string\(6\) "sqlsrv"
Test_4:
Set Result PDO::ATTR_STRINGIFY_FETCHES :
bool\(true\)
Get Result PDO::ATTR_STRINGIFY_FETCHES :
bool\(true\)
Test_5:
Set Result PDO::ATTR_CLIENT_VERSION :
SQLSTATE\[IMSSP\]: A read-only attribute was designated on the PDO object.
Get Result PDO::ATTR_CLIENT_VERSION :
array\(4\) {
\[\"(DriverDllName|DriverName)\"\]=>
string\(15\) \"msodbcsql[0-9]{2}\.dll|string\(24\) \"libmsodbcsql-[0-9]{2}\.[0-9]\.so\.[0-9]\.[0-9]\"
\["DriverODBCVer"\]=>
string\(5\) \"[0-9]{1,2}\.[0-9]{1,2}\"
\["DriverVer"\]=>
string\(10\) "[0-9]{2}.[0-9]{2}.[0-9]{4}"
\["ExtensionVer"\]=>
string\([0-9]*\) \"[0-9]\.[0-9]\.[0-9](\-((rc)|(preview))(\.[0-9]+)?)?(\+[0-9]+)?\"
}
Test_6:
Set Result PDO::ATTR_SERVER_INFO :
SQLSTATE\[IMSSP\]: A read-only attribute was designated on the PDO object.
Get Result PDO::ATTR_SERVER_INFO :
array\(3\) {
\["CurrentDatabase"\]=>
string\([0-9]*\) ".*"
\["SQLServerVersion"\]=>
string\(10\) "[0-9]{2}.[0-9]{2}.[0-9]{4}"
\["SQLServerName"\]=>
string\([0-9]*\) ".*"
}
Test_7:
Set Result PDO::ATTR_CASE :
bool\(true\)
Get Result PDO::ATTR_CASE :
int\(2\)
Test_8:
Set Result PDO::SQLSRV_ATTR_ENCODING :
bool\(true\)
Get Result PDO::SQLSRV_ATTR_ENCODING :
int\(3\)
Test_9:
Set Result PDO::ATTR_DEFAULT_FETCH_MODE :
bool\(true\)
Get Result PDO::ATTR_DEFAULT_FETCH_MODE :
int\(2\)
Test_10:
Set Result PDO::ATTR_ORACLE_NULLS :
bool\(true\)
Get Result PDO::ATTR_ORACLE_NULLS :
int\(0\)
Test_11:
Set Result PDO::SQLSRV_ATTR_CLIENT_BUFFER_MAX_KB_SIZE :
bool\(true\)
Get Result PDO::SQLSRV_ATTR_CLIENT_BUFFER_MAX_KB_SIZE :
int\(5120\)
Test_12:
Set Result PDO::SQLSRV_ATTR_DIRECT_QUERY :
bool\(true\)
Get Result PDO::SQLSRV_ATTR_DIRECT_QUERY :
bool\(true\)
Test_13:
Set Result PDO::ATTR_STATEMENT_CLASS :
bool\(true\)
Get Result PDO::ATTR_STATEMENT_CLASS :
array\(2\) {
\[0\]=>
string\(18\) "CustomPDOStatement"
\[1\]=>
array\(0\) {
}
}
Test_14:
Set Result PDO::SQLSRV_ATTR_QUERY_TIMEOUT :
bool\(true\)
Get Result PDO::SQLSRV_ATTR_QUERY_TIMEOUT :
int\(10\)
Test_15:
Set Result PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE :
bool\(true\)
Get Result PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE :
bool\(false\)

View file

@ -0,0 +1,35 @@
--TEST--
Test PDO::__Construct with invalid connection option
--SKIPIF--
--FILE--
<?php
require_once("autonomous_setup.php");
try
{
$database = "tempdb";
$dsn = "sqlsrv:Server = $serverName;" .
"Database = $database;" .
"InvalidKey = true;"
;
$conn = new PDO( $dsn, $username, $password);
echo "Test Successful";
}
catch( PDOException $e ) {
var_dump( $e->errorInfo );
}
?>
--EXPECT--
array(3) {
[0]=>
string(5) "IMSSP"
[1]=>
int(-42)
[2]=>
string(64) "An invalid keyword 'InvalidKey' was specified in the DSN string."
}

View file

@ -0,0 +1,52 @@
--TEST--
Test the PDO::lastInsertId() method.
--SKIPIF--
--FILE--
<?php
require_once("autonomous_setup.php");
try
{
$database = "tempdb";
$conn = new PDO("sqlsrv:Server=$serverName;Database=$database", $username, $password);
$conn->exec("IF OBJECT_ID('tmp_table1', 'U') IS NOT NULL DROP TABLE [tmp_table1]");
$conn->exec("IF OBJECT_ID('tmp_table2', 'U') IS NOT NULL DROP TABLE [tmp_table2]");
$conn->exec("IF OBJECT_ID('tmp_table3', 'U') IS NOT NULL DROP TABLE [tmp_table3]");
$conn->exec('CREATE TABLE tmp_table1(id INT IDENTITY(100,2), val INT)');
$conn->exec('CREATE TABLE tmp_table2(id INT IDENTITY(200,2), val INT)');
$conn->exec('CREATE TABLE tmp_table3(id INT, val INT)');
$conn->exec('INSERT INTO tmp_table1 VALUES(1)');
$conn->exec('INSERT INTO tmp_table2 VALUES(2)');
$id = $conn->lastInsertId();
var_dump($id);
$conn->exec('INSERT INTO tmp_table2 VALUES(3)');
$conn->exec('INSERT INTO tmp_table1 VALUES(4)');
$id = $conn->lastInsertId();
var_dump($id);
// Should return empty string as the table does not have an IDENTITY column.
$conn->exec('INSERT INTO tmp_table3 VALUES(1,1)');
$id = $conn->lastInsertId();
var_dump($id);
// clean up
$conn->exec('DROP TABLE tmp_table1');
$conn->exec('DROP TABLE tmp_table2');
$conn->exec('DROP TABLE tmp_table3');
}
catch( PDOException $e ) {
var_dump( $e );
exit;
}
?>
--EXPECT--
string(3) "200"
string(3) "102"
string(0) ""

View file

@ -0,0 +1,34 @@
--TEST--
Test PDO::prepare by passing in invalid cursor value
--SKIPIF--
--FILE--
<?php
require_once("autonomous_setup.php");
try
{
$database = "tempdb";
$conn = new PDO( "sqlsrv:Server = $serverName; Database = $database", $username, $password);
// PDO::CURSOR_FWDONLY should not be quoted
$stmt1 = $conn->prepare( "SELECT 1", array( PDO::ATTR_CURSOR => "PDO::CURSOR_FWDONLY" ));
print_r(($conn->errorInfo())[2]);
echo "\n";
// 10 is an invalid value for PDO::ATTR_CURSOR
$stmt2 = $conn->prepare( "SELECT 2", array( PDO::ATTR_CURSOR => 10 ));
print_r(($conn->errorInfo())[2]);
echo "\n";
}
catch( PDOException $e ) {
var_dump( $e->errorInfo );
}
?>
--EXPECT--
An invalid cursor type was specified for either PDO::ATTR_CURSOR or PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE
An invalid cursor type was specified for either PDO::ATTR_CURSOR or PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE

View file

@ -0,0 +1,33 @@
--TEST--
Test PDO::prepare by passing in invalid encoding values
--SKIPIF--
--FILE--
<?php
require_once("autonomous_setup.php");
try
{
$database = "tempdb";
$conn = new PDO( "sqlsrv:Server = $serverName; Database = $database", $username, $password);
// PDO::SQLSRV_ENCODING_SYSTEM should not be quoted
$stmt1 = $conn->prepare( "SELECT 1", array( PDO::SQLSRV_ATTR_ENCODING => "PDO::SQLSRV_ENCODING_SYSTEM" ));
print_r(($conn->errorInfo())[2]);
echo "\n";
// 10 is an invalid value for PDO::SQLSRV_ATTR_ENCODING
$stmt2 = $conn->prepare( "SELECT 2", array( PDO::SQLSRV_ATTR_ENCODING => 10 ));
print_r(($conn->errorInfo())[2]);
echo "\n";
}
catch( PDOException $e ) {
var_dump( $e->errorInfo );
}
?>
--EXPECT--
An invalid encoding was specified for SQLSRV_ATTR_ENCODING.
An invalid encoding was specified for SQLSRV_ATTR_ENCODING.

View file

@ -0,0 +1,36 @@
--TEST--
Test PDO::prepare by passing in a string key
--SKIPIF--
--FILE--
<?php
require_once("autonomous_setup.php");
try
{
$database = "tempdb";
$dsn = "sqlsrv:Server = $serverName; Database = $database";
$attr = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
$conn = new PDO( $dsn, $username, $password, $attr);
$stmt = $conn->prepare( "SELECT 1", array( "PDO::ATTR_CURSOR" => PDO::CURSOR_FWDONLY ));
echo "Test Successful";
}
catch( PDOException $e ) {
var_dump( $e->errorInfo );
}
?>
--EXPECT--
array(3) {
[0]=>
string(5) "IMSSP"
[1]=>
int(-43)
[2]=>
string(42) "An invalid statement option was specified."
}

View file

@ -0,0 +1,36 @@
--TEST--
Test PDO::prepare by passing in invalid scrollable type value
--SKIPIF--
--FILE--
<?php
require_once("autonomous_setup.php");
try
{
$database = "tempdb";
$conn = new PDO( "sqlsrv:Server = $serverName; Database = $database", $username, $password);
//$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
// PDO::SQLSRV_CURSOR_BUFFERED should not be quoted
$stmt1 = $conn->prepare( "SELECT 1", array( PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => "PDO::SQLSRV_CURSOR_BUFFERED" ));
// if ATTR_CURSOR is FWDONLY, cannot set SCROLL_TYPE
$stmt2 = $conn->prepare( "SELECT 2", array( PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY, PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_BUFFERED ));
if ( $stmt1 || $stmt2 )
{
echo "Invalid values for PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE should return false.\n";
} else {
echo "Invalid values for PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE return false.\n";
}
}
catch( PDOException $e ) {
var_dump( $e->errorInfo );
}
?>
--EXPECT--
Invalid values for PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE return false.

View file

@ -0,0 +1,41 @@
--TEST--
Test PDO::prepare by passing in attributes
--SKIPIF--
--FILE--
<?php
require_once("autonomous_setup.php");
try
{
class CustomPDOStatement extends PDOStatement
{
protected function __construct() {
}
}
$database = "tempdb";
$dsn = "sqlsrv:Server = $serverName; Database = $database";
$prep_attr = array(PDO::SQLSRV_ATTR_ENCODING => PDO::SQLSRV_ENCODING_UTF8,
PDO::ATTR_STATEMENT_CLASS => array('CustomPDOStatement', array()),
PDO::SQLSRV_ATTR_DIRECT_QUERY => true,
PDO::ATTR_EMULATE_PREPARES => false,
PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE => true
);
$conn = new PDO( $dsn, $username, $password);
$stmt = $conn->prepare( "SELECT 1", $prep_attr );
echo "Test Successful";
}
catch( PDOException $e ) {
var_dump( $e->errorInfo );
exit;
}
?>
--EXPECT--
Test Successful

View file

@ -0,0 +1,34 @@
--TEST--
Test setting invalid value or key in connection attributes
--SKIPIF--
--FILE--
<?php
require_once("autonomous_setup.php");
try{
$database = "tempdb";
$dsn = "sqlsrv:Server = $serverName; Database = $database";
$conn = new PDO( $dsn, $username, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT));
// Negative value for query timeout: should raise error
@$conn->setAttribute( PDO::SQLSRV_ATTR_QUERY_TIMEOUT, -1 );
print_r (($conn->errorInfo())[2]);
echo "\n";
// PDO::ATTR_CURSOR is a Statement Level Attribute only
@$conn->setAttribute( PDO::ATTR_CURSOR, PDO::CURSOR_SCROLL );
print_r (($conn->errorInfo())[2]);
}
catch ( PDOException $e ){
exit;
}
?>
--EXPECT--
Invalid value -1 specified for option PDO::SQLSRV_ATTR_QUERY_TIMEOUT.
The given attribute is only supported on the PDOStatement object.

View file

@ -0,0 +1,40 @@
--TEST--
Test setting invalid encoding attributes
--SKIPIF--
--FILE--
<?php
require_once("autonomous_setup.php");
try{
$database = "tempdb";
$dsn = "sqlsrv:Server = $serverName; Database = $database";
$conn = new PDO( $dsn, $username, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT));
// valid option: should have no error
@$conn->setAttribute( PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_DEFAULT );
print_r (($conn->errorInfo())[2]);
echo "\n";
// PDO::SQLSRV_ENCODING_UTF8 should not be quoted
@$conn->setAttribute( PDO::SQLSRV_ATTR_ENCODING, "PDO::SQLSRV_ENCODING_UTF8" );
print_r (($conn->errorInfo())[2]);
echo "\n";
// PDO::SQLSRV_ENCODING_BINARY is not supported
@$conn->setAttribute( PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_BINARY );
print_r (($conn->errorInfo())[2]);
echo "\n";
}
catch ( PDOException $e ){
exit;
}
?>
--EXPECT--
An invalid encoding was specified for SQLSRV_ATTR_ENCODING.
An invalid encoding was specified for SQLSRV_ATTR_ENCODING.

View file

@ -0,0 +1,51 @@
--TEST--
starts a transaction, delete rows and rollback the transaction; starts a transaction, delete rows and commit
--SKIPIF--
--FILE--
<?php
require_once("autonomous_setup.php");
$conn = new PDO( "sqlsrv:Server=$serverName; Database = tempdb", $username, $password);
$conn->exec("IF OBJECT_ID('Table1', 'U') IS NOT NULL DROP TABLE Table1");
$conn->exec("CREATE TABLE Table1(col1 CHARACTER(1), col2 CHARACTER(1))");
$ret = $conn->exec("INSERT INTO Table1(col1, col2) VALUES('a', 'b')");
$ret = $conn->exec("INSERT INTO Table1(col1, col2) VALUES('a', 'c')");
//revert the inserts but roll back
$conn->beginTransaction();
$rows = $conn->exec("DELETE FROM Table1 WHERE col1 = 'a'");
$conn->rollback();
$stmt = $conn->query("SELECT * FROM Table1");
// Table1 should still have 2 rows since delete was rolled back
if ( count( $stmt->fetchAll() ) == 2 )
echo "Transaction rolled back successfully\n";
else
echo "Transaction failed to roll back\n";
//revert the inserts then commit
$conn->beginTransaction();
$rows = $conn->exec("DELETE FROM Table1 WHERE col1 = 'a'");
$conn->commit();
echo $rows." rows affected\n";
$stmt = $conn->query("SELECT * FROM Table1");
if ( count( $stmt->fetchAll() ) == 0 )
echo "Transaction committed successfully\n";
else
echo "Transaction failed to commit\n";
//drop the created temp table
$conn->exec("DROP TABLE Table1");
//free statement and connection
$stmt = NULL;
$conn = NULL;
?>
--EXPECT--
Transaction rolled back successfully
2 rows affected
Transaction committed successfully

View file

@ -0,0 +1,38 @@
--TEST--
Test warnings on connection and statement levels
--SKIPIF--
--FILE--
<?php
try{
require_once("autonomous_setup.php");
$conn = new PDO( "sqlsrv:Server=$serverName; Database = tempdb ", $username, $password);
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
// raise a warning in connection
$conn->getAttribute( PDO::ATTR_TIMEOUT );
$conn->exec("IF OBJECT_ID('table1', 'U') IS NOT NULL DROP TABLE table1");
// raise a warning in statement
$statement = $conn->prepare("CRATE TABLE table1(id INT NOT NULL PRIMARY KEY, val VARCHAR(10)) ");
$statement->execute();
$statement = NULL;
$conn = NULL;
}
catch ( PDOException $e ){
var_dump( $e->errorInfo );
exit;
}
?>
--EXPECTREGEX--
Warning: SQLSTATE: IMSSP
Error Code: -38
Error Message: An unsupported attribute was designated on the PDO object\.
in .+(\/|\\)pdo_warnings\.php on line [0-9]+
Warning: PDO::getAttribute\(\): SQLSTATE\[IM001\]: Driver does not support this function: driver does not support that attribute in .+(\/|\\)pdo_warnings\.php on line [0-9]+
Warning: PDOStatement::execute\(\): SQLSTATE\[42000\]: Syntax error or access violation: 156 \[Microsoft\]\[ODBC Driver [0-9]+ for SQL Server\]\[SQL Server\]Incorrect syntax near the keyword 'TABLE'\. in .+(\/|\\)pdo_warnings\.php on line [0-9]+

View file

@ -0,0 +1,47 @@
--TEST--
Test the bindColumn method using PDO::PARAM_NULL and PDO::PARAM_STMT
--SKIPIF--
--FILE--
<?php
require_once("autonomous_setup.php");
try
{
$conn = new PDO( "sqlsrv:Server=$serverName; Database = tempdb ", $username, $password);
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$conn->exec("IF OBJECT_ID('table1', 'U') IS NOT NULL DROP TABLE table1");
$conn->exec("CREATE TABLE table1(IntCol INT, CharCol NVARCHAR(20)) ");
$conn->exec("INSERT INTO table1 (IntCol, CharCol) VALUES (10, 'ten')");
$stmt = $conn->prepare("SELECT IntCol FROM table1");
$stmt->execute();
// PARAM_NULL returns null
$stmt->bindColumn('IntCol', $intCol, PDO::PARAM_NULL);
$row = $stmt->fetch(PDO::FETCH_BOUND);
if ($intCol == NULL) {
echo "intCol is NULL\n";
} else {
echo "intCol should have been NULL\n";
}
$stmt = $conn->prepare("SELECT CharCol FROM table1");
$stmt->execute();
// PARAM_STMT is not supported and should throw an exception
$stmt->bindColumn('CharCol', $charCol, PDO::PARAM_STMT);
$row = $stmt->fetch(PDO::FETCH_BOUND);
echo "PARAM_STMT should have thrown an exception\n";
}
catch (PDOException $e)
{
print_r($e->errorInfo[2]);
echo "\n";
}
?>
--EXPECT--
intCol is NULL
PDO::PARAM_STMT is not a supported parameter type.

View file

@ -0,0 +1,184 @@
--TEST--
Test setting and getting various statement attributes.
--SKIPIF--
--FILE--
<?php
require_once("autonomous_setup.php");
function set_stmt_option($conn, $arr)
{
try {
$stmt = $conn->prepare( "Select * from temptb", $arr );
return $stmt;
}
catch( PDOException $e)
{
echo $e->getMessage() . "\n\n";
return NULL;
}
}
function set_stmt_attr($conn, $attr, $val)
{
$stmt = NULL;
try
{
echo "Set Attribute: " . $attr . "\n";
$stmt = $conn->prepare( "Select * from temptb");
}
catch( PDOException $e)
{
echo $e->getMessage() . "\n\n";
return NULL;
}
try {
$res = $stmt->setAttribute(constant($attr), $val);
var_dump($res);
echo "\n\n";
}
catch( PDOException $e)
{
echo $e->getMessage() . "\n\n";
}
return $stmt;
}
function get_stmt_attr($stmt, $attr)
{
try
{
echo "Get Attribute: " . $attr. "\n";
$res = $stmt->getAttribute(constant($attr));
var_dump($res);
echo "\n";
}
catch( PDOException $e)
{
echo $e->getMessage() . "\n\n";
}
}
// valid
function Test1($conn)
{
echo "Test1 - Set stmt option: SQLSRV_ATTR_ENCODING, ATTR_CURSOR, SQLSRV_ATTR_QUERY_TIMEOUT \n";
set_stmt_option($conn, array(PDO::SQLSRV_ATTR_ENCODING => 3, PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY, PDO::SQLSRV_ATTR_QUERY_TIMEOUT => 44));
echo "Test Successful\n\n";
}
// invalid
function Test2($conn)
{
echo "Test2 - Set stmt option: 'QueryTimeout' \n";
set_stmt_option($conn, array("QueryTimeout" => 44 ));
}
// valid attributes
function Test3($conn)
{
echo "Test3 \n";
$attr = "PDO::ATTR_CURSOR";
$stmt = set_stmt_attr($conn, $attr, 1);
if($stmt)
get_stmt_attr($stmt, $attr);
else
echo "Test3: stmt was null";
}
// not supported attribute
function Test4($conn)
{
echo "Test4 \n";
$attr = "PDO::ATTR_SERVER_VERSION";
$stmt = set_stmt_attr($conn, $attr, "whatever");
get_stmt_attr($stmt, $attr);
}
// not supported attribute value
function Test5($conn)
{
echo "Test5 \n";
$attr = "PDO::ATTR_CURSOR";
$stmt = set_stmt_attr($conn, $attr, 3);
get_stmt_attr($stmt, $attr);
}
// valid GET/SET attribute and set option
function Test6($conn)
{
echo "Test6 - Set stmt option: SQLSRV_ATTR_ENCODING \n";
set_stmt_option($conn, array(PDO::SQLSRV_ATTR_ENCODING => 3));
$attr = "PDO::SQLSRV_ATTR_QUERY_TIMEOUT";
$stmt = set_stmt_attr($conn, $attr, 45);
get_stmt_attr($stmt, $attr);
}
try
{
$conn = new PDO( "sqlsrv:Server=$serverName; Database = tempdb ", $username, $password);
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$conn->exec("IF OBJECT_ID('temptb', 'U') IS NOT NULL DROP TABLE temptb");
$conn->exec("CREATE TABLE temptb(id INT NOT NULL PRIMARY KEY, val VARCHAR(10)) ");
test1($conn);
test2($conn);
test3($conn);
test4($conn);
test5($conn);
test6($conn);
}
catch( PDOException $e ) {
var_dump( $e );
exit;
}
?>
--EXPECTREGEX--
Test1 - Set stmt option: SQLSRV_ATTR_ENCODING, ATTR_CURSOR, SQLSRV_ATTR_QUERY_TIMEOUT
Test Successful
Test2 - Set stmt option: 'QueryTimeout'
SQLSTATE\[IMSSP\]: An invalid statement option was specified.
Test3
Set Attribute: PDO::ATTR_CURSOR
SQLSTATE\[IMSSP\]: The PDO::ATTR_CURSOR and PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE attributes may only be set in the \$driver_options array of PDO::prepare.
Get Attribute: PDO::ATTR_CURSOR
int\(0\)
Test4
Set Attribute: PDO::ATTR_SERVER_VERSION
(SQLSTATE\[IMSSP\]: An invalid attribute was designated on the PDOStatement object.)|(SQLSTATE\[IM001\]: Driver does not support this function: driver doesn't support getting that attribute)
Get Attribute: PDO::ATTR_SERVER_VERSION
SQLSTATE\[IMSSP\]: An invalid attribute was designated on the PDOStatement object.
Test5
Set Attribute: PDO::ATTR_CURSOR
SQLSTATE\[IMSSP\]: The PDO::ATTR_CURSOR and PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE attributes may only be set in the \$driver_options array of PDO::prepare.
Get Attribute: PDO::ATTR_CURSOR
int\(0\)
Test6 - Set stmt option: SQLSRV_ATTR_ENCODING
Set Attribute: PDO::SQLSRV_ATTR_QUERY_TIMEOUT
bool\(true\)
Get Attribute: PDO::SQLSRV_ATTR_QUERY_TIMEOUT
int\(45\)