diff --git a/test/functional/pdo_sqlsrv/pdo_569_query_varcharmax.phpt b/test/functional/pdo_sqlsrv/pdo_569_query_varcharmax.phpt new file mode 100644 index 00000000..e5639988 --- /dev/null +++ b/test/functional/pdo_sqlsrv/pdo_569_query_varcharmax.phpt @@ -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-- + +--FILE-- +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 \ No newline at end of file diff --git a/test/functional/sqlsrv/srv_569_query_varcharmax.phpt b/test/functional/sqlsrv/srv_569_query_varcharmax.phpt new file mode 100644 index 00000000..1a41a629 --- /dev/null +++ b/test/functional/sqlsrv/srv_569_query_varcharmax.phpt @@ -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-- + +--FILE-- + $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 \ No newline at end of file