Skip to content

Commit

Permalink
Updated drivers and tests to support PHP 8.0.0 RC1 (#1194)
Browse files Browse the repository at this point in the history
  • Loading branch information
yitam authored Sep 30, 2020
1 parent d2c7254 commit ec60302
Show file tree
Hide file tree
Showing 8 changed files with 107 additions and 30 deletions.
2 changes: 1 addition & 1 deletion appveyor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ environment:
SQL_INSTANCE: SQL2019
PHP_VC: vs16
PHP_MAJOR_VER: 8.0
PHP_MINOR_VER: 0beta4
PHP_MINOR_VER: 0rc1
PHP_EXE_PATH: Release
THREAD: nts
platform: x86
Expand Down
6 changes: 5 additions & 1 deletion source/shared/core_stmt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1938,7 +1938,11 @@ void core_get_field_common( _Inout_ sqlsrv_stmt* stmt, _In_ SQLUSMALLINT field_i
throw core::CoreException();
}

stream = php_stream_open_wrapper( "sqlsrv://sqlncli10", "r", 0, NULL );
// For a sqlsrv stream, only REPORT_ERRORS may be used. For "mode", the 'b' option
// is ignored on POSIX systems, which treat text and binary files the same. Yet, the
// 'b' option might be important in other systems.
// For details check https://www.php.net/manual/en/internals2.ze1.streams.php
stream = php_stream_open_wrapper("sqlsrv://sqlncli10", "rb", REPORT_ERRORS, NULL);

CHECK_CUSTOM_ERROR( !stream, stmt, SQLSRV_ERROR_STREAM_CREATE ) {
throw core::CoreException();
Expand Down
9 changes: 6 additions & 3 deletions source/shared/core_stream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -238,9 +238,12 @@ static php_stream* sqlsrv_stream_opener( _In_opt_ php_stream_wrapper* wrapper, _
ss = static_cast<sqlsrv_stream*>( sqlsrv_malloc( sizeof( sqlsrv_stream )));
memset( ss, 0, sizeof( sqlsrv_stream ));

// check for valid options
if( options != REPORT_ERRORS ) {
php_stream_wrapper_log_error( wrapper, options, "Invalid option: no options except REPORT_ERRORS may be specified with a sqlsrv stream" );
// The function core_get_field_common() is changed to pass REPORT_ERRORS for
// php_stream_open_wrapper(). Whether the error flag is toggled or cleared,
// the argument "options" will be zero.
// For details check this pull request: https://github.com/php/php-src/pull/6190
if (options != 0) {
php_stream_wrapper_log_error(wrapper, options, "Invalid option: no options except REPORT_ERRORS may be specified with a sqlsrv stream");
return NULL;
}

Expand Down
2 changes: 2 additions & 0 deletions source/sqlsrv/init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,8 @@ ZEND_END_ARG_INFO()

ZEND_BEGIN_ARG_INFO_EX( sqlsrv_fetch_arginfo, 0, 0, 1 )
ZEND_ARG_INFO( 0, stmt )
ZEND_ARG_INFO( 0, row )
ZEND_ARG_INFO( 0, offset )
ZEND_END_ARG_INFO()

ZEND_BEGIN_ARG_INFO_EX( sqlsrv_fetch_array_arginfo, 0, 0, 1 )
Expand Down
20 changes: 16 additions & 4 deletions test/functional/pdo_sqlsrv/pdo_connection_quote.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,23 @@ try {
$output3 = $conn->quote("<XmlTestData><Letters>The quick brown fox jumps over the lazy dog</Letters><Digits>0123456789</Digits></XmlTestData>");
var_dump($output3);

$stmt = $conn->query("");
if ($stmt != false) {
echo("Empty query was expected to fail!\n");
if (PHP_MAJOR_VERSION < 8) {
$stmt = $conn->query("");
if ($stmt != false) {
echo("Empty query was expected to fail!\n");
}
unset($stmt);
} else {
try {
$stmt = $conn->query("");
echo("Empty query was expected to fail!\n");
} catch (ValueError $ve) {
$error = '*PDO::query(): Argument #1 ($query) cannot be empty';
if (!fnmatch($error, $ve->getMessage())) {
var_dump($ve->getMessage());
}
}
}
unset($stmt);

$stmt1 = $conn->prepare($output2);
$result = $stmt1->execute();
Expand Down
32 changes: 26 additions & 6 deletions test/functional/pdo_sqlsrv/pdo_fetch_column_twice.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -88,21 +88,42 @@ function fetchColumnOutOfBound1($conn, $tableName, $col)
echo "Error message unexpected in fetchColumnOutOfBound1\n";
var_dump($e->getMessage());
}
} catch (ValueError $ve) {
$error = '*Column index must be greater than or equal to 0';
if (!fnmatch($error, $ve->getMessage())) {
echo "Error message unexpected in fetchColumnOutOfBound1\n";
var_dump($ve->getMessage());
}
}
}

function fetchColumnOutOfBound2($conn, $tableName, $col)
{
$error = '*Invalid column index';
try {
$tsql = "SELECT * FROM $tableName";
$stmt = $conn->query($tsql, PDO::FETCH_COLUMN, $col);
$result = $stmt->fetch();
unset($stmt);
} catch (PDOException $e) {
var_dump($e->getMessage());
} catch (Error $e) {
if (!fnmatch($error, $e->getMessage())) {
var_dump($e->getMessage());
}
} catch (ValueError $ve) {
if (!fnmatch($error, $ve->getMessage())) {
var_dump($ve->getMessage());
}
}
}

// When testing with PHP 8.0 some test cases throw ValueError instead of exceptions or warnings.
// Thus implement a custom warning handler such that with PHP 7.x the warning would be handled
// to throw an Error (ValueError not available).
function warningHandler($errno, $errstr)
{
throw new Error($errstr);
}

try {
$conn = connect();
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Expand Down Expand Up @@ -135,7 +156,9 @@ try {

// Change to warning mode
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
set_error_handler("warningHandler", E_WARNING);
fetchColumnOutOfBound2($conn, $tableName, $numCols + 1);
restore_error_handler();

dropTable($conn, $tableName);
unset($conn);
Expand All @@ -144,8 +167,5 @@ try {
var_dump($e);
}
?>
--EXPECTREGEX--
Warning: PDOStatement::fetch\(\): SQLSTATE\[HY000\]: General error: Invalid column index in .+(\/|\\)pdo_fetch_column_twice.php on line [0-9]+

Warning: PDOStatement::fetch\(\): SQLSTATE\[HY000\]: General error in .+(\/|\\)pdo_fetch_column_twice.php on line [0-9]+
--EXPECT--
Done
34 changes: 26 additions & 8 deletions test/functional/pdo_sqlsrv/pdostatement_getColumnMeta.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -49,22 +49,43 @@ function fetchBoth($conn, $tbname)
unset($meta["sqlsrv:decl_type"]);
var_dump($meta);

// Test invalid arguments, set error mode to silent to reduce the amount of error messages generated
// Test invalid arguments, set error mode to silent to reduce the number of error messages generated
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);

// Test negative column number, ignore the error messages
$meta = $stmt->getColumnMeta(-1);
var_dump($meta);
// Test negative column number
try {
$meta = $stmt->getColumnMeta(-1);
echo "Expect getColumnMeta to fail with -1\n";
} catch (Error $e) {
if (PHP_MAJOR_VERSION == 8) {
$error = '*PDOStatement::getColumnMeta(): Argument #1 ($index) must be greater than or equal to 0*';
} else {
$error = '*Invalid column reference: column number must be non-negative*';
}
if (!fnmatch($error, $e->getMessage())) {
echo "Unexpected error:";
var_dump($e->getMessage());
}
}

// Test non-existent column number
$meta = $stmt->getColumnMeta(10);
var_dump($meta);
}

// When testing with PHP 8.0 the negative test case throws an Error instead of a warning.
// Implement a custom warning handler such that with PHP 7.x the warning would be handled
// to throw an Error.
function warningHandler($errno, $errstr)
{
throw new Error($errstr);
}

try {
$db = connect();
$tbname = "PDO_MainTypes";
createAndInsertTableMainTypes($db, $tbname);
set_error_handler("warningHandler", E_WARNING);
fetchBoth($db, $tbname);
} catch (PDOException $e) {
var_dump($e);
Expand All @@ -73,7 +94,7 @@ try {


?>
--EXPECTF--
--EXPECT--

array(8) {
["flags"]=>
Expand Down Expand Up @@ -217,7 +238,4 @@ array(7) {
["precision"]=>
int(0)
}

Warning: PDOStatement::getColumnMeta(): SQLSTATE[42P10]: Invalid column reference: column number must be non-negative in %s on line %x
bool(false)
bool(false)
Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,35 @@ function fetchBoth($conn, $tbname)
// Test invalid arguments, set error mode to silent to reduce the amount of error messages generated
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);

// Test negative column number, ignore the error messages
$meta = $stmt->getColumnMeta(-1);
var_dump($meta);
// Test negative column number
try {
$meta = $stmt->getColumnMeta(-1);
echo "Expect getColumnMeta to fail with -1\n";
} catch (Error $e) {
if (PHP_MAJOR_VERSION == 8) {
$error = '*PDOStatement::getColumnMeta(): Argument #1 ($index) must be greater than or equal to 0*';
} else {
$error = '*Invalid column reference: column number must be non-negative*';
}
if (!fnmatch($error, $e->getMessage())) {
echo "Unexpected error:";
var_dump($e->getMessage());
}
}

// Test non-existent column number
$meta = $stmt->getColumnMeta(10);
var_dump($meta);
}

// When testing with PHP 8.0 the negative test case throws an Error instead of a warning.
// Implement a custom warning handler such that with PHP 7.x the warning would be handled
// to throw an Error.
function warningHandler($errno, $errstr)
{
throw new Error($errstr);
}

function createAndInsertTableUnicode($conn, $tbname)
{
try {
Expand Down Expand Up @@ -106,13 +126,14 @@ try {
$db = connect();
$tbname = "PDO_MainTypes";
createAndInsertTableUnicode($db, $tbname);
set_error_handler("warningHandler", E_WARNING);
fetchBoth($db, $tbname);
} catch (PDOException $e) {
var_dump($e);
exit;
}
?>
--EXPECTF--
--EXPECT--

array(8) {
["flags"]=>
Expand Down Expand Up @@ -256,7 +277,4 @@ array(7) {
["precision"]=>
int(0)
}

Warning: PDOStatement::getColumnMeta(): SQLSTATE[42P10]: Invalid column reference: column number must be non-negative in %s on line %x
bool(false)
bool(false)

0 comments on commit ec60302

Please sign in to comment.