Updated drivers and tests to support PHP 8.0.0 RC1 (#1194)

This commit is contained in:
Jenny Tam 2020-09-29 17:53:58 -07:00 committed by GitHub
parent d2c7254442
commit ec60302825
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 107 additions and 30 deletions

View file

@ -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

View file

@ -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();

View file

@ -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;
}

View file

@ -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 )

View file

@ -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();

View file

@ -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);
@ -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);
@ -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

View file

@ -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);
@ -73,7 +94,7 @@ try {
?>
--EXPECTF--
--EXPECT--
array(8) {
["flags"]=>
@ -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)

View file

@ -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 {
@ -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"]=>
@ -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)