-
Notifications
You must be signed in to change notification settings - Fork 375
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Added error handling for LOB types as output parameters #584
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,133 @@ | ||
--TEST-- | ||
GitHub issue #231 - String truncation when binding text/ntext/image to check error messages | ||
--ENV-- | ||
PHPT_EXEC=true | ||
--SKIPIF-- | ||
<?php require('skipif_versions_old.inc'); ?> | ||
--FILE-- | ||
<?php | ||
|
||
sqlsrv_configure('WarningsReturnAsErrors', 1); | ||
|
||
require_once("MsCommon.inc"); | ||
|
||
// connect | ||
$conn = AE\connect(); | ||
if (!$conn) { | ||
fatalError("Connection could not be established.\n"); | ||
} | ||
|
||
$tableName = 'testLOBTypes_GH231'; | ||
$columnNames = array("c1", "c2"); | ||
|
||
for ($k = 1; $k <= 3; $k++) { | ||
$sqlType = sqlType($k); | ||
$columns = array(new AE\ColumnMeta('int', $columnNames[0]), | ||
new AE\ColumnMeta($sqlType, $columnNames[1])); | ||
AE\createTable($conn, $tableName, $columns); | ||
|
||
$sql = "INSERT INTO [$tableName] ($columnNames[0], $columnNames[1]) VALUES (?, ?)"; | ||
$data = getData($k); | ||
|
||
$phpType = SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR); | ||
$sqlsrvSQLType = sqlsrvSqlType($k, strlen($data)); | ||
|
||
$params = array($k, array($data, SQLSRV_PARAM_IN, $phpType, $sqlsrvSQLType)); | ||
$stmt = sqlsrv_prepare($conn, $sql, $params); | ||
sqlsrv_execute($stmt); | ||
sqlsrv_free_stmt($stmt); | ||
|
||
execProc($conn, $tableName, $columnNames, $k, $data, $sqlType); | ||
|
||
dropTable($conn, $tableName); | ||
} | ||
|
||
sqlsrv_close($conn); | ||
|
||
|
||
function execProc($conn, $tableName, $columnNames, $k, $data, $sqlType) | ||
{ | ||
$spArgs = "@p1 int, @p2 $sqlType OUTPUT"; | ||
$spCode = "SET @p2 = ( SELECT c2 FROM $tableName WHERE c1 = @p1 )"; | ||
$procName = "testBindOutSp"; | ||
|
||
$stmt1 = sqlsrv_query($conn, "CREATE PROC [$procName] ($spArgs) AS BEGIN $spCode END"); | ||
sqlsrv_free_stmt($stmt1); | ||
|
||
echo "\nData Type: ".$sqlType." binding as \n"; | ||
|
||
$direction = SQLSRV_PARAM_OUT; | ||
echo "Output parameter: "; | ||
invokeProc($conn, $procName, $k, $direction, $data); | ||
|
||
$direction = SQLSRV_PARAM_INOUT; | ||
echo "InOut parameter: "; | ||
invokeProc($conn, $procName, $k, $direction, $data); | ||
|
||
dropProc($conn, $procName); | ||
} | ||
|
||
function invokeProc($conn, $procName, $k, $direction, $data) | ||
{ | ||
$sqlsrvSQLType = sqlsrvSqlType($k, strlen($data)); | ||
$callArgs = "?, ?"; | ||
|
||
// Data to initialize $callResult variable | ||
$initData = "ShortString"; | ||
$callResult = $initData; | ||
|
||
// Make sure not to specify the PHP type | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why must you not specify the php type here? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's a copy of another test for issue #231. I can remove the comment if you like. It doesn't matter for this particular test There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Then may as well remove it... |
||
$intType = AE\isColEncrypted()? SQLSRV_SQLTYPE_INT : null; | ||
$params = array( array( $k, SQLSRV_PARAM_IN, null, $intType ), | ||
array( &$callResult, $direction, null, $sqlsrvSQLType )); | ||
$stmt = sqlsrv_query($conn, "{ CALL [$procName] ($callArgs)}", $params); | ||
if ($stmt) { | ||
fatalError("Expect this to fail!"); | ||
} else { | ||
echo (sqlsrv_errors()[0]['message']) . PHP_EOL; | ||
} | ||
} | ||
|
||
function getData($k) | ||
{ | ||
$data = "LongStringForTesting"; | ||
return $data; | ||
} | ||
|
||
function sqlType($k) | ||
{ | ||
switch ($k) { | ||
case 1: return ("text"); | ||
case 2: return ("ntext"); | ||
case 3: return ("image"); | ||
default: break; | ||
} | ||
return ("udt"); | ||
} | ||
|
||
function sqlsrvSqlType($k, $dataSize) | ||
{ | ||
switch ($k) { | ||
case 1: return (SQLSRV_SQLTYPE_TEXT); | ||
case 2: return (SQLSRV_SQLTYPE_NTEXT); | ||
case 3: return (SQLSRV_SQLTYPE_IMAGE); | ||
default: break; | ||
} | ||
return (SQLSRV_SQLTYPE_UDT); | ||
} | ||
|
||
?> | ||
|
||
--EXPECT-- | ||
|
||
Data Type: text binding as | ||
Output parameter: Stored Procedures do not support text, ntext or image as OUTPUT parameters. | ||
InOut parameter: Stored Procedures do not support text, ntext or image as OUTPUT parameters. | ||
|
||
Data Type: ntext binding as | ||
Output parameter: Stored Procedures do not support text, ntext or image as OUTPUT parameters. | ||
InOut parameter: Stored Procedures do not support text, ntext or image as OUTPUT parameters. | ||
|
||
Data Type: image binding as | ||
Output parameter: Stored Procedures do not support text, ntext or image as OUTPUT parameters. | ||
InOut parameter: Stored Procedures do not support text, ntext or image as OUTPUT parameters. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think you should amend this comment to explain the error check that you added below. "But first, check that we are not using a LOB type with an output parameter" or something like that.