Skip to content

Commit

Permalink
Added new tests for issue 569 (#951)
Browse files Browse the repository at this point in the history
  • Loading branch information
yitam authored Mar 14, 2019
1 parent bedc430 commit df8d7da
Show file tree
Hide file tree
Showing 2 changed files with 203 additions and 0 deletions.
94 changes: 94 additions & 0 deletions test/functional/pdo_sqlsrv/pdo_569_query_varcharmax.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
--TEST--
GitHub issue #569 - direct query on varchar max fields results in function sequence error
--DESCRIPTION--
Verifies that the problem is no longer reproducible.
--ENV--
PHPT_EXEC=true
--SKIPIF--
<?php require('skipif_mid-refactor.inc'); ?>
--FILE--
<?php
require_once("MsSetup.inc");
require_once("MsCommon_mid-refactor.inc");

try {
$connectionInfo = "ColumnEncryption = Enabled;";
$conn = new PDO("sqlsrv:server = $server; database=$databaseName; $connectionInfo", $uid, $pwd);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$tableName = 'pdoTestTable_569';
dropTable($conn, $tableName);

if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
$tsql = "CREATE TABLE $tableName ([c1] varchar(max) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (ENCRYPTION_TYPE = deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256', COLUMN_ENCRYPTION_KEY = AEColumnKey))";
} else {
$tsql = "CREATE TABLE $tableName ([c1] varchar(max))";
}
$conn->exec($tsql);

$input = 'some very large string';
$tsql = "INSERT INTO $tableName (c1) VALUES (?)";
$stmt = $conn->prepare($tsql);
$param = array($input);
$stmt->execute($param);

$tsql = "SELECT * FROM $tableName";
try {
$stmt = $conn->prepare($tsql);
$stmt->execute();
} catch (PDOException $e) {
echo ("Failed to read from $tableName\n");
echo $e->getMessage();
}

$row = $stmt->fetch(PDO::FETCH_NUM);
if ($row[0] !== $input) {
echo "Expected $input but got: ";
var_dump($row[0]);
}

$tsql2 = "DELETE FROM $tableName";
$rows = $conn->exec($tsql2);
if ($rows !== 1) {
echo 'Expected 1 row affected but got: ';
var_dump($rows);
}

// Fetch from the empty table
try {
$stmt = $conn->prepare($tsql);
$stmt->execute();
} catch (PDOException $e) {
echo ("Failed to read $tableName, now empty\n");
echo $e->getMessage();
}

$result = $stmt->fetch(PDO::FETCH_NUM);
if ($result !== false) {
echo 'Expected bool(false) when fetching an empty table but got: ';
var_dump($result);
}

// Fetch the same table but using client cursor
$stmt = $conn->prepare($tsql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$stmt->execute();

$result = $stmt->fetch();
if ($result !== false) {
echo 'Expected bool(false) when fetching an empty table but got: ';
var_dump($result);
}

dropTable($conn, $tableName);

unset($stmt);
unset($conn);
} catch (PDOException $e) {
echo $e->getMessage();
}

echo "Done\n";

?>
--EXPECT--
Done
109 changes: 109 additions & 0 deletions test/functional/sqlsrv/srv_569_query_varcharmax.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
--TEST--
GitHub issue #569 - sqlsrv_query on varchar max fields results in function sequence error
--DESCRIPTION--
Verifies that the problem is no longer reproducible.
--ENV--
PHPT_EXEC=true
--SKIPIF--
<?php require('skipif_versions_old.inc'); ?>
--FILE--
<?php

function verifyFetchError()
{
$expected = 'A row must be retrieved with sqlsrv_fetch before retrieving data with sqlsrv_get_field.';
if (strpos(sqlsrv_errors()[0]['message'], $expected) === false) {
print_r(sqlsrv_errors());
}
}

require_once('MsCommon.inc');

$connectionOptions = array("Database" => $database, "UID" => $userName, "PWD" => $userPassword, "ColumnEncryption" => "Enabled");
$conn = sqlsrv_connect($server, $connectionOptions);
if ($conn === false) {
fatalError("Failed to connect to $server.");
}

$tableName = 'srvTestTable_569';

dropTable($conn, $tableName);

if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
$tsql = "CREATE TABLE $tableName ([c1] varchar(max) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (ENCRYPTION_TYPE = deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256', COLUMN_ENCRYPTION_KEY = AEColumnKey))";
} else {
$tsql = "CREATE TABLE $tableName ([c1] varchar(max))";
}

$stmt = sqlsrv_query($conn, $tsql);
if (!$stmt) {
fatalError("Failed to create $tableName");
}

$input = 'some very large string';
$stmt = sqlsrv_prepare($conn, "INSERT INTO $tableName (c1) VALUES (?)", array($input));
sqlsrv_execute($stmt);

$tsql = "SELECT * FROM $tableName";
$stmt = sqlsrv_query($conn, $tsql);
if (!$stmt) {
fatalError("Failed to read from $tableName");
}

sqlsrv_fetch($stmt);
$fieldVal = sqlsrv_get_field($stmt, 0, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR));

if ($fieldVal !== $input) {
echo "Expected $input but got: ";
var_dump($fieldVal);
}

$tsql2 = "DELETE FROM $tableName";
$stmt = sqlsrv_query($conn, $tsql2);
if (!$stmt) {
fatalError("Failed to delete rows from $tableName");
}

$stmt = sqlsrv_query($conn, $tsql);
if (!$stmt) {
fatalError("Failed to read $tableName, now empty");
}

$result = sqlsrv_fetch($stmt);
if (!is_null($result)) {
echo 'Expected null when fetching an empty table but got: ';
var_dump($result);
}

$fieldVal = sqlsrv_get_field($stmt, 0, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR));
verifyFetchError();
if ($fieldVal !== false) {
echo 'Expected bool(false) but got: ';
var_dump($fieldVal);
}

$stmt = sqlsrv_query($conn, $tsql, array(), array("Scrollable"=>"buffered"));
$result = sqlsrv_fetch($stmt);
if (!is_null($result)) {
echo 'Expected null when fetching an empty table but got: ';
var_dump($result);
}

$fieldVal = sqlsrv_get_field($stmt, 0, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR));
verifyFetchError();
if ($fieldVal !== false) {
echo 'Expected bool(false) but got: ';
var_dump($fieldVal);
}


dropTable($conn, $tableName);

echo "Done\n";

sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);

?>
--EXPECT--
Done

0 comments on commit df8d7da

Please sign in to comment.