php-sqlsrv/test/functional/sqlsrv/sqlsrv_statement_datetimes_as_strings.phpt
Jenny Tam b47cec284b
Dev to Master - 5.4.0-preview (#853)
* Fixed the potential error reported by Prefast code analysis

* Use SQLSRV_ASSERT for checking NULL ptrs

* For these AKV tests check env despite not AE connected

* Added the driver option to run functional tests

* Fixed connection pooling tests for more than one ODBC drivers

* added driver option to pdo isPooled.php

* Removed win32 ifdefs re connection resiliency (#802)

* Set the driver argument for getDSN to null by default (#798)

* Added the driver argument to getDSN

* Dropped the driver argument but set to null as default

* Removed the AE condition in locale support

* Modified the AE condition for locale support

* Changed int to SQLLEN to avoid infinite loop (#806)

* Version 5.3.0 (#803)

* Version 5.3.0

* Fixed the wrong replacements

* Added comments block to m4 files

* Use dnl for comments

*  Modified AE fetch phptypes test to insert only one row at a time and loop through php types (#801)

* Modified AE fetch phptypes test to insert only one row at a time and loop through php types

* Fixed formatting

* Streamlined two very similar large column name tests (#807)

* Streamlined two very similar large column name tests

* Changed the EOL

* Updates to change log and readme (#811)

* Updates to change log and readme

* Dropped support for Ubuntu 17

* Modified as per review comments

* Fixed connection resiliency tests for Unix, updated AppVeyor for ODBC 17.2

* Fixed expected output

* Fixed output and skipifs

* Fixed skipifs and output

* Fixed driver name

* Updated installation instructions and sample script (#813)

* Updated instructions and sample test for 5.3.0 RTW

* Fixed sample code to adhere to php coding standard

* Fixed cases and spaces

* Modified NOTE for UB 18.04 based on review comments

* Added 'exit'

* Modified change log and readme based on review to PR 811

* Applied review comments

* build output to debug appveyor failure

* removed debug output

* Streamlined two very similar large column name tests (#815)

* Streamlined two very similar large column name tests

* Added random number of test table names to avoid operand clash issues

* Replaced to with for based on review

* Changelog updated

* changelog updated, test skipif changed to run on unix platforms

* Fixed skipif typo

* Fixed typo in skipif for pdo

* Fixed some output for Travis

* Moved error checking inside pdo connres tests

* Added links back to changelog

* Fixed output for sqlsrv connres tests

* Fixed output

* Fixed output again

* Fixed skipifs for connres

* Tweaked per review comments

* Changes made to source and tests to support PHP 7.3 (#822)

* Changes made to support php 7.3

* Correct use of the smart pointer

* Fixed the tests for 7.3

* Some clean up for array_init()

* Fixed formattings and clean up

* One more fix

* Initialising strings with nulls

* Removed some spaces

* Made array index spacing consistent

* Fix for compilation problem

* Fix for compilation problem again

* Before freeing stmt in destructor check if dbh driver data is NULL  (#829)

* Issue 434 - set dbh driver data to NULL as well in destructor

* Reverted the last change but instead check if dbh driver_data is already freed

* Modified the comment

* Added driver to the skipif conditions (#831)

* Used git clone instead to download source from a branch of a tag (#832)

* Modified the error handling to make it more flexible (#833)

* Made error handling more flexible

* Fixed a minor issue with a test

* Enabled Spectre Mitigations (#836)

* Incorporated changes in PR 634 to pdo_sqlsrv (#834)

* Incorporated changes in PR 634 to pdo_sqlsrv

* Reverted the changes because the array is for internal use only

* Modified README re user's suggestion (#841)

* Modified README re user's suggestion

* Moved the if condition to the end as per review

* Adding supporting for Azure AD access token (#837)

* Adding supporting for Azure AD access token

* Added more comments for the AD access token skipif files

* Save the pointer to access token struct until after connecting

* Clear the access token data before freeing the memory

* Added a reference as per review

* Feature request - new PDO_STMT_OPTION_FETCHES_DATETIME_TYPE flag for pdo_sqlsrv to return datetime as objects (#842)

* Feature request - issue 648

* Fixed constructor for field_cache and added another test

* Added tests for FETCH_BOUND

* Added a new test for output param

* Modified output param test to set attributes differently

* Removed a useless helped function in a test

* Combined two new tests into one as per review

* Uncommented dropTable

* Feature request - add ReturnDatesAsStrings option to statement level for sqlsrv  (#844)

* Added ReturnDatesAsStrings option to the statement level

* Added new tests for ReturnDatesAsStrings at statement level

* Added more datetime types as per review

* Updated version 5.4.0-preview (#846)

* Updated version 5.4.0-preview

* Replaced 5.3 with 5.4

* Fixed sqlsrv datetime tests to connect with ColumnEncryption variables (#849)

* Change log for 5.4.0-preview (#850)

* Updated change log for 5.4.0-preview

* Updated 5.4.0 preview to add two new feature requests

* Modified change log as per review

* Modified the wordings

* Updated readme, changelog, and install instructions
2018-09-24 13:26:43 -07:00

203 lines
6.9 KiB
PHP

--TEST--
Test retrieving datetime values with statement option ReturnDatesAsStrings set to true
--DESCRIPTION--
Test retrieving datetime values with statement option ReturnDatesAsStrings set to true,
which is false by default. The statement option should override the corresponding
connection option ReturnDatesAsStrings.
--SKIPIF--
<?php require('skipif_versions_old.inc'); ?>
--FILE--
<?php
require_once('MsCommon.inc');
function compareDateTime($expectedStr, $actualObj)
{
$dtime = date_create($expectedStr);
$dtExpected = $dtime->format('Y-m-d H:i:s.u');
// actual datetime value from date time object to string
$dtActual = date_format($actualObj, 'Y-m-d H:i:s.u');
return ($dtActual === $dtExpected);
}
function testNoOption($conn, $tableName, $inputs, $exec)
{
// Without the statement option, should return datetime values as strings
// because the connection option ReturnDatesAsStrings is set to true
$query = "SELECT * FROM $tableName";
if ($exec) {
$stmt = sqlsrv_query($conn, $query);
} else {
$stmt = sqlsrv_prepare($conn, $query);
sqlsrv_execute($stmt);
}
$results = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_NUMERIC);
// Compare values only
$diffs = array_diff($inputs, $results);
if (!empty($diffs)) {
echo 'The results are different from the input values: ';
print_r($diffs);
}
}
function testStmtOption($conn, $tableName, $inputs, $stmtDateAsStr)
{
// The statement option should always override the connection option
$query = "SELECT * FROM $tableName";
$options = array('ReturnDatesAsStrings' => $stmtDateAsStr);
$stmt = sqlsrv_query($conn, $query, array(), $options);
if ($stmtDateAsStr) {
$results = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
// Compare values only
$diffs = array_diff($inputs, $results);
if (!empty($diffs)) {
echo 'The results are different from the input values: ';
print_r($diffs);
}
} else {
$results = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_NUMERIC);
// Expect DateTime Objects in $results
for ($i = 0; $i < count($inputs); $i++) {
if (is_object($results[$i])) {
$matched = compareDateTime($inputs[$i], $results[$i]);
if (!$matched) {
echo "Expected a DateTime object of $inputs[$i] but got: \n";
var_dump($results[$i]);
}
} else {
echo "Expect a DateTime object but got $results[$i]\n";
}
}
}
}
function testFetching($conn, $tableName, $inputs, $columns, $withBuffer)
{
// The statement option ReturnDatesAsStrings set to true
// Test different fetching
$query = "SELECT * FROM $tableName";
if ($withBuffer){
$options = array('Scrollable' => 'buffered', 'ReturnDatesAsStrings' => true);
} else {
$options = array('ReturnDatesAsStrings' => true);
}
$size = count($inputs);
$stmt = sqlsrv_prepare($conn, $query, array(), $options);
// Fetch by getting one field at a time
sqlsrv_execute($stmt);
if( sqlsrv_fetch( $stmt ) === false) {
fatalError("Failed in retrieving data\n");
}
for ($i = 0; $i < $size; $i++) {
$field = sqlsrv_get_field($stmt, $i); // expect string
if ($field != $inputs[$i]) {
echo "Expected $inputs[$i] for column $columns[$i] but got: ";
var_dump($field);
}
}
// Fetch row as an object
sqlsrv_execute($stmt);
$object = sqlsrv_fetch_object($stmt);
$objArray = (array)$object; // turn the object into an associated array
for ($i = 0; $i < $size; $i++) {
$col = $columns[$i];
$val = $objArray[$col];
if ($val != $inputs[$i]) {
echo "Expected $inputs[$i] for column $columns[$i] but got: ";
var_dump($val);
}
}
}
set_time_limit(0);
sqlsrv_configure('WarningsReturnAsErrors', 1);
date_default_timezone_set('America/Los_Angeles');
// Connect with ReturnDatesAsStrings option set to true
$conn = connect(array('ReturnDatesAsStrings' => true));
if (!$conn) {
fatalError("Could not connect.\n");
}
// Generate input values for the test table
$query = 'SELECT CONVERT(date, SYSDATETIME()), SYSDATETIME(),
CONVERT(smalldatetime, SYSDATETIME()),
CONVERT(datetime, SYSDATETIME()),
SYSDATETIMEOFFSET(),
CONVERT(time, SYSDATETIME())';
$stmt = sqlsrv_query($conn, $query);
$values = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_NUMERIC);
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
// Connect again with ColumnEncryption data
$conn = AE\connect(array('ReturnDatesAsStrings' => true));
// Create the test table of date and time columns
$tableName = 'StmtDateAsString';
$columns = array('c1', 'c2', 'c3', 'c4', 'c5', 'c6');
$dataTypes = array('date', 'datetime2', 'smalldatetime', 'datetime', 'datetimeoffset', 'time');
$colMeta = array(new AE\ColumnMeta($dataTypes[0], $columns[0]),
new AE\ColumnMeta($dataTypes[1], $columns[1]),
new AE\ColumnMeta($dataTypes[2], $columns[2]),
new AE\ColumnMeta($dataTypes[3], $columns[3]),
new AE\ColumnMeta($dataTypes[4], $columns[4]),
new AE\ColumnMeta($dataTypes[5], $columns[5]));
AE\createTable($conn, $tableName, $colMeta);
// Insert data values
$inputData = array($colMeta[0]->colName => $values[0],
$colMeta[1]->colName => $values[1],
$colMeta[2]->colName => $values[2],
$colMeta[3]->colName => $values[3],
$colMeta[4]->colName => $values[4],
$colMeta[5]->colName => $values[5]);
$stmt = AE\insertRow($conn, $tableName, $inputData);
if (!$stmt) {
fatalError("Failed to insert data.\n");
}
sqlsrv_free_stmt($stmt);
// Do not set ReturnDatesAsStrings at statement level
testNoOption($conn, $tableName, $values, true);
testNoOption($conn, $tableName, $values, false);
// Set ReturnDatesAsStrings to false at statement level
testStmtOption($conn, $tableName, $values, false);
sqlsrv_close($conn);
// Now connect but with ReturnDatesAsStrings option set to false
$conn = AE\connect(array('ReturnDatesAsStrings' => false));
if (!$conn) {
fatalError("Could not connect.\n");
}
// Set ReturnDatesAsStrings to true at statement level
testStmtOption($conn, $tableName, $values, true);
// Test fetching by setting ReturnDatesAsStrings to true at statement level
testFetching($conn, $tableName, $values, $columns, true);
testFetching($conn, $tableName, $values, $columns, false);
dropTable($conn, $tableName);
sqlsrv_close($conn);
echo "Done\n";
?>
--EXPECT--
Done