Skip to content
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 test case for Issue 699 #773

Merged
merged 7 commits into from
May 17, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 16 additions & 16 deletions source/shared/core_stmt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1856,16 +1856,16 @@ SQLSMALLINT default_c_type( _Inout_ sqlsrv_stmt* stmt, _In_opt_ SQLULEN paramno,
break;
case IS_TRUE:
case IS_FALSE:
sql_c_type = SQL_C_SLONG;
break;
sql_c_type = SQL_C_SLONG;
break;
case IS_LONG:
//ODBC 64-bit long and integer type are 4 byte values.
if ( ( Z_LVAL_P( param_z ) < INT_MIN ) || ( Z_LVAL_P( param_z ) > INT_MAX ) ) {
sql_c_type = SQL_C_SBIGINT;
}
else {
sql_c_type = SQL_C_SLONG;
}
//ODBC 64-bit long and integer type are 4 byte values.
if ((Z_LVAL_P(param_z) < INT_MIN) || (Z_LVAL_P(param_z) > INT_MAX)) {
sql_c_type = SQL_C_SBIGINT;
}
else {
sql_c_type = SQL_C_SLONG;
}
break;
case IS_DOUBLE:
sql_c_type = SQL_C_DOUBLE;
Expand Down Expand Up @@ -1929,13 +1929,13 @@ void default_sql_type( _Inout_ sqlsrv_stmt* stmt, _In_opt_ SQLULEN paramno, _In_
sql_type = SQL_INTEGER;
break;
case IS_LONG:
//ODBC 64-bit long and integer type are 4 byte values.
if ( ( Z_LVAL_P( param_z ) < INT_MIN ) || ( Z_LVAL_P( param_z ) > INT_MAX ) ) {
sql_type = SQL_BIGINT;
}
else {
sql_type = SQL_INTEGER;
}
//ODBC 64-bit long and integer type are 4 byte values.
if ((Z_LVAL_P(param_z) < INT_MIN) || (Z_LVAL_P(param_z) > INT_MAX)) {
sql_type = SQL_BIGINT;
}
else {
sql_type = SQL_INTEGER;
}
break;
case IS_DOUBLE:
sql_type = SQL_FLOAT;
Expand Down
94 changes: 94 additions & 0 deletions test/functional/sqlsrv/srv_699_out_param_integer.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
--TEST--
GitHub issue #699 - binding integer as output parameter failed
--DESCRIPTION--
This test uses the sample stored procedure provided by the user, in which an
error situation caused the binding to fail with an irrelevant error message about UTF-8 translation. This test proves that this issue has been fixed.
--ENV--
PHPT_EXEC=true
--SKIPIF--
<?php require('skipif.inc'); ?>
--FILE--
<?php
require_once('MsCommon.inc');

$connectionOptions = array("CharacterSet"=> "UTF-8", "ConnectionPooling"=>1);
$conn = connect($connectionOptions);

$tableName1 = "table_issue699_1";
$tableName2 = "table_issue699_2";
$procName = "proc_issue699";

dropTable($conn, $tableName1);
dropTable($conn, $tableName2);
dropProc($conn, $procName);

// Create two test tables without encryption
$sql = "CREATE TABLE $tableName1 (correio_electronico NVARCHAR(50), nome NVARCHAR(50), telefones NVARCHAR(15), id_entidade INT)";
$stmt = sqlsrv_query($conn, $sql);
if (!$stmt) {
fatalError("Failed to create table $tableName1\n");
}

$sql = "CREATE TABLE $tableName2 (estado TINYINT NOT NULL DEFAULT 0)";
$stmt = sqlsrv_query($conn, $sql);
if (!$stmt) {
fatalError("Failed to create table $tableName2\n");
}

// Create the stored procedure
$sql = "CREATE PROCEDURE $procName @outparam INT OUTPUT AS
BEGIN
SET @outparam = 100;
INSERT INTO $tableName1 (correio_electronico, nome, telefones, id_entidade)
SELECT '[email protected]', 'Teste', 'xxx', 1
FROM $tableName2 CC
WHERE CC.estado = 100
BEGIN TRY
SET @outparam = 123
END TRY
BEGIN CATCH
END CATCH
END";

$stmt = sqlsrv_query($conn, $sql);
if (!$stmt) {
fatalError("Error in creating the stored procedure $procName\n");
}

$set_no_count = "";
if (strtoupper(substr(PHP_OS, 0, 3)) === 'LIN') {
// This test, when running outside of Windows, requires unixODBC 2.3.4
// or above (see the list of bug fixes in www.unixodbc.org)
// Add this workaround for Linux platforms
$set_no_count = "SET NOCOUNT ON; ";
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So this is the only thing that has to change to get the test to pass in Linux?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, because unixODBC later versions fixed some bugs related to "SQLMoreResults" or "SQL_NO_DATA". By setting nocount these calls are bypassed.

}

$sql_callSP = $set_no_count . "{call $procName(?)}";

// Initialize the output parameter to any number
$outParam = 1;
$params = array(array(&$outParam, SQLSRV_PARAM_OUT));
$stmt = sqlsrv_query($conn, $sql_callSP, $params);
if (!$stmt) {
fatalError("Error in calling $procName\n");
}

while ($res = sqlsrv_next_result($stmt));

if ($outParam != 123) {
echo "The output param value $outParam is unexpected!\n";
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think display the $outParam here so we can see immediately what it is if it fails.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, it is being printed in the echo stmt as $outParm

}

dropTable($conn, $tableName1);
dropTable($conn, $tableName2);
dropProc($conn, $procName);

// Free handles
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);

echo "Done\n";

?>
--EXPECT--
Done