2017-05-04 01:00:31 +02:00
|
|
|
--TEST--
|
|
|
|
Stored Proc Query Test
|
|
|
|
--DESCRIPTION--
|
|
|
|
Verifies the data retrieved via a store procedure to validate behavior
|
|
|
|
of queries including SQLSRV_PARAM_OUT qualifiers.
|
|
|
|
Checks all numeric data types (i.e. 10 SQL types).
|
|
|
|
--ENV--
|
|
|
|
PHPT_EXEC=true
|
|
|
|
--SKIPIF--
|
2017-10-27 18:32:57 +02:00
|
|
|
<?php require('skipif_versions_old.inc'); ?>
|
2017-05-04 01:00:31 +02:00
|
|
|
--FILE--
|
|
|
|
<?php
|
2017-10-04 23:22:56 +02:00
|
|
|
require_once('MsCommon.inc');
|
2017-05-04 01:00:31 +02:00
|
|
|
|
2017-10-24 02:04:35 +02:00
|
|
|
function procQuery($minType, $maxType)
|
2017-05-04 01:00:31 +02:00
|
|
|
{
|
|
|
|
$testName = "Stored Proc Query";
|
2017-10-04 23:22:56 +02:00
|
|
|
startTest($testName);
|
2017-05-04 01:00:31 +02:00
|
|
|
|
2017-10-04 23:22:56 +02:00
|
|
|
setup();
|
2017-10-24 02:04:35 +02:00
|
|
|
$tableName = 'TC74test';
|
|
|
|
$procName = "TC74test_proc";
|
|
|
|
$conn1 = AE\connect();
|
2017-05-04 01:00:31 +02:00
|
|
|
|
2017-10-04 23:22:56 +02:00
|
|
|
for ($k = $minType; $k <= $maxType; $k++) {
|
|
|
|
switch ($k) {
|
2017-05-04 01:00:31 +02:00
|
|
|
case 1: // TINYINT
|
2017-10-26 19:48:36 +02:00
|
|
|
execProcQuery($conn1, $procName, $k, "TINYINT", 11, 12, 23);
|
2017-05-04 01:00:31 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 2: // SMALLINT
|
2017-10-26 19:48:36 +02:00
|
|
|
execProcQuery($conn1, $procName, $k, "SMALLINT", 4.3, 5.5, 9);
|
2017-05-04 01:00:31 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 3: // INT
|
2017-10-26 19:48:36 +02:00
|
|
|
execProcQuery($conn1, $procName, $k, "INT", 3.2, 4, 7);
|
2017-05-04 01:00:31 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 4: // BIGINT
|
2017-10-26 19:48:36 +02:00
|
|
|
execProcQuery($conn1, $procName, $k, "BIGINT", 5.2, 3.7, 8);
|
2017-05-04 01:00:31 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 5: // FLOAT
|
2017-10-26 19:48:36 +02:00
|
|
|
execProcQuery($conn1, $procName, $k, "FLOAT", 2.5, 5.25, 7.75);
|
2017-05-04 01:00:31 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 6: // REAL
|
2017-10-26 19:48:36 +02:00
|
|
|
execProcQuery($conn1, $procName, $k, "REAL", 3.4, 6.6, 10);
|
2017-05-04 01:00:31 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 7: // DECIMAL
|
2017-10-26 19:48:36 +02:00
|
|
|
execProcQuery($conn1, $procName, $k, "DECIMAL", 2.1, 5.3, 7);
|
2017-05-04 01:00:31 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 8: // NUMERIC
|
2017-10-26 19:48:36 +02:00
|
|
|
execProcQuery($conn1, $procName, $k, "NUMERIC", 2.8, 5.4, 8);
|
2017-05-04 01:00:31 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 9: // SMALLMONEY
|
2017-10-26 19:48:36 +02:00
|
|
|
execProcQuery($conn1, $procName, $k, "SMALLMONEY", 10, 11.7, 21.7);
|
2017-05-04 01:00:31 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 10:// MONEY
|
2017-10-26 19:48:36 +02:00
|
|
|
execProcQuery($conn1, $procName, $k, "MONEY", 22.3, 16.1, 38.4);
|
2017-05-04 01:00:31 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:// default
|
|
|
|
break;
|
|
|
|
}
|
2017-10-04 23:22:56 +02:00
|
|
|
}
|
2017-05-04 01:00:31 +02:00
|
|
|
|
|
|
|
sqlsrv_close($conn1);
|
|
|
|
|
2017-10-04 23:22:56 +02:00
|
|
|
endTest($testName);
|
2017-05-04 01:00:31 +02:00
|
|
|
}
|
|
|
|
|
2017-10-26 19:48:36 +02:00
|
|
|
function execProcQuery($conn, $procName, $type, $dataType, $inData1, $inData2, $outData)
|
2017-05-04 01:00:31 +02:00
|
|
|
{
|
|
|
|
$procArgs = "@p1 $dataType, @p2 $dataType, @p3 $dataType OUTPUT";
|
|
|
|
$procCode = "SELECT @p3 = CONVERT($dataType, @p1 + @p2)";
|
2017-10-04 23:22:56 +02:00
|
|
|
createProc($conn, $procName, $procArgs, $procCode);
|
2017-05-04 01:00:31 +02:00
|
|
|
|
|
|
|
$callArgs = "?, ?, ?";
|
|
|
|
$callResult = 0.0;
|
2017-10-24 02:04:35 +02:00
|
|
|
if (!AE\isColEncrypted()) {
|
|
|
|
$callValues = array($inData1, $inData2, array(&$callResult, SQLSRV_PARAM_OUT));
|
|
|
|
} else {
|
|
|
|
if ($type == 7 || $type == 8) {
|
|
|
|
// DECIMAL or NUMERIC
|
|
|
|
$driverType = call_user_func("SQLSRV_SQLTYPE_$dataType", 2, 1);
|
|
|
|
} else {
|
|
|
|
$driverType = constant("SQLSRV_SQLTYPE_$dataType");
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($type >= 1 && $type < 5) {
|
|
|
|
// for any kinds of integers convert the inputs to integers first
|
|
|
|
// AE is stricter with data types
|
|
|
|
$inData1 = floor($inData1);
|
|
|
|
$inData2 = floor($inData2);
|
|
|
|
}
|
|
|
|
$callValues = array(array($inData1, null, null, $driverType),
|
|
|
|
array($inData2, null, null, $driverType),
|
|
|
|
array(&$callResult, SQLSRV_PARAM_OUT, null, $driverType));
|
|
|
|
}
|
|
|
|
|
2017-10-04 23:22:56 +02:00
|
|
|
callProc($conn, $procName, $callArgs, $callValues);
|
|
|
|
dropProc($conn, $procName);
|
2017-05-04 01:00:31 +02:00
|
|
|
|
2017-10-24 02:04:35 +02:00
|
|
|
traceData($dataType, "".$inData1." + ".$inData2." = ".$callResult);
|
2017-10-04 23:22:56 +02:00
|
|
|
if ($callResult != $outData) {
|
2017-05-04 01:00:31 +02:00
|
|
|
die("Expected result for ".$dataType." was ".$outData);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-10-24 02:04:35 +02:00
|
|
|
try {
|
|
|
|
procQuery(1, 10);
|
|
|
|
} catch (Exception $e) {
|
|
|
|
echo $e->getMessage();
|
2017-05-04 01:00:31 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
?>
|
|
|
|
--EXPECT--
|
|
|
|
Test "Stored Proc Query" completed successfully.
|