php-sqlsrv/test/functional/sqlsrv/TC33_ComplexQuery.phpt

134 lines
6.6 KiB
Plaintext
Raw Normal View History

2017-05-04 01:00:31 +02:00
--TEST--
Complex Query Test
--DESCRIPTION--
Verifies the behavior of INSERT queries with and without the IDENTITY flag set.
--ENV--
PHPT_EXEC=true
--SKIPIF--
<?php require('skipif_versions_old.inc'); ?>
2017-05-04 01:00:31 +02:00
--FILE--
<?php
require_once('MsCommon.inc');
2017-05-04 01:00:31 +02:00
function complexQuery()
2017-05-04 01:00:31 +02:00
{
$testName = "Statement - Complex Query";
startTest($testName);
2017-05-04 01:00:31 +02:00
setup();
$conn1 = AE\connect();
2017-05-04 01:00:31 +02:00
$tableName = 'TC33test';
$columns = array(new AE\ColumnMeta('int', 'c1_int', "IDENTITY"),
new AE\ColumnMeta('tinyint', 'c2_tinyint'),
new AE\ColumnMeta('smallint', 'c3_smallint'),
new AE\ColumnMeta('bigint', 'c4_bigint'),
new AE\ColumnMeta('varchar(512)', 'c5_varchar'));
AE\createTable($conn1, $tableName, $columns);
2017-05-04 01:00:31 +02:00
// SET IDENTITY_INSERT ON/OFF only works at execute or run time and not at parse time
// because a prepared statement runs in a separate context
// https://technet.microsoft.com/en-us/library/ms188059(v=sql.110).aspx
$query = "SET IDENTITY_INSERT [$tableName] ON;";
$stmt = sqlsrv_query($conn1, $query);
if (!$stmt) {
die("Unexpected execution outcome for \'$query\'.");
}
// expect this to pass
$inputs = array("c1_int" => -204401468, "c2_tinyint" => 168, "c3_smallint" => 4787, "c4_bigint" =>1583186637, "c5_varchar" => "<22><<3C><>C~z<><7A>a.Oa._ߣ*<2A><u_<75><5F>C<EFBFBD>oa <20><><EFBFBD><EFBFBD><EFBFBD>a+O<>h<EFBFBD>obUa:zB_C<5F>@~U<>z+<2B><><EFBFBD>//Z@<40>o_:r,o<><6F>r<EFBFBD>zoZ<6F><><DFAA>~ U<>a><3E><>ZU<5A>/<2F>_Z<5F><5A><EFBFBD><EFBFBD>h<EFBFBD>C<EFBFBD>+/.ob<6F>|<7C><><EFBFBD>,<2C><><EFBFBD><EFBFBD>:<3A><>:*/>+/<2F>a<EFBFBD>.<2E><><<3C>:><3E>O~*~<7E><>z<EFBFBD><7A><<3C><><EFBFBD><EFBFBD>.O,><3E>,<2C>b<EFBFBD>@b<>h<EFBFBD>C*<<hb<68><62>*o<><6F>h<EFBFBD><68><EFBFBD>a+A/_@b/<2F>B<EFBFBD>B<EFBFBD><42>@<40>~z<>Z<EFBFBD>C@<40>U_<55>U<EFBFBD>hvU*a@<40><><EFBFBD>:<3A>ZA<5A>Ab<41>U_<55><5F>b<EFBFBD><62>:<3A><><EFBFBD>or<6F><72>ߪ_<DFAA><5F>֪z<D6AA><7A><EFBFBD><EFBFBD>oa<6F> <<3C>~zZ<7A>aB.+<2B>A<EFBFBD><41><EFBFBD>><<3C>:/Ur <20><>U<EFBFBD><55>Oa<4F>:a|++<2B><>.r~:/+<2B>|<7C><>o++v_@BZ:<3A><>A<EFBFBD>C<EFBFBD>.<2E>/Ab<,<2C><>>U<><55><EFBFBD><EFBFBD>bb|<7C><>ߣ:<3A><<b<><62>a+,<_a<5F>._<>><3E><|<7C>z<EFBFBD>z@><3E><>:a,C<>r__<5F>.<<3C><>C<EFBFBD>+U<>U<EFBFBD>_<EFBFBD>z<EFBFBD> b<>~<7E>o|, .<2E>,b/U><3E><>aBZ@ܣ: b<>v<EFBFBD>b><3E>/<2F><>@<40><>/<2F>b<EFBFBD>+r:Z<>><3E><>|<7C>u<EFBFBD><75>ZAC:C<>h *.ã<>_<EFBFBD><5F>u|Ur<55>.:aAUv@u>@<<3C><>.<<3C>Z b<>ZA<5A>֣o<D6A3><6F><EFBFBD>*,<2C>:<3A><>");
$stmt = insertTest($conn1, $tableName, true, $inputs);
$query = "SET IDENTITY_INSERT [$tableName] OFF;";
$stmt = sqlsrv_query($conn1, $query);
if (!$stmt) {
die("Unexpected execution outcome for \'$query\'.");
}
// expect this to fail
$inputs = array("c1_int" => 1264768176, "c2_tinyint" => 111, "c3_smallint" => 23449, "c4_bigint" =>1421472052, "c5_varchar" => "u<><75>C@b<>UOv~,<2C>v,BZ<42>*oh>zb_<62><5F><EFBFBD><@*OO<4F>_<EFBFBD><<3C>u<EFBFBD>/o<>r <<3C><>b<EFBFBD>U<EFBFBD><55><EFBFBD><EFBFBD><EFBFBD>~<7E>~<7E><62>.u<>Т<EFBFBD>:|_<><5F><EFBFBD>B<EFBFBD>b<EFBFBD><62><EFBFBD><EFBFBD>v@,<C<>O<EFBFBD>v~:+,CZ<43>vhC/o<>Uu<55><75>a<<3C>><3E>/Ub,+AЩ<41>:<3A>r<EFBFBD>B+~~<7E><><EFBFBD><EFBFBD><EFBFBD>+_<vO@ <20><><EFBFBD><EFBFBD><EFBFBD>aCz<43><7A><EFBFBD>@:r<>.~vh~r.<2E>b<EFBFBD><62><EFBFBD><EFBFBD>_<EFBFBD>C<EFBFBD>r B<><42>:BbUv<55><76><EFBFBD>Z+|,C<>aA<61>C,a<>bb*U<><55><EFBFBD>A hCu<43>hOb <20>|<7C>C.<C<.aB<61>vu<76><75><EFBFBD>,A<>a>AB<41><42>U/O<<3C><><EFBFBD><EFBFBD>O<EFBFBD>uߣ~u<>+<2B><>rb<72>/:<3A><>o /_<>O:u<>z<EFBFBD>Uv<55><76>A<EFBFBD>_B<5F>/>UCr,<2C><> a<><61>aãv<C3A3>Z@<40>r*_::~/+.<2E>~<7E><>a<EFBFBD><61>bz*z<~rU~O+Z|A<_B<5F>ߩ<EFBFBD><DFA9> ::.<2E>b<EFBFBD><62><EFBFBD>r/<2F>rh<72>:<3A><>U <20>OA~A<>r<<3C><>v<EFBFBD><76>+hC/v<>oU<6F>+O<><4F><EFBFBD>*<2A><>B<EFBFBD>.Zbh/<2F>,<2C><>>*<2A><><EFBFBD>U<EFBFBD><55>>a<>bBbv<62><76><EFBFBD>/b<>|<7C><> u.z<><7A>~<7E><>z<EFBFBD>U.UA*a*.<2E>><3E> r<> ~C<><43>a<EFBFBD>+r<>~<7E>@a<>/<2F>C<EFBFBD>*a,<2C><>bb<o+v.<2E>u<<3C>B<<3C>BZ<42><5A>u<EFBFBD>/_>*~");
$stmt = insertTest($conn1, $tableName, false, $inputs);
// expect this to pass
$query = "SET IDENTITY_INSERT [$tableName] ON; SQL; SET IDENTITY_INSERT [$tableName] OFF;";
if (AE\isColEncrypted()){
// When AE is enabled, SQL types must be specified for sqlsrv_query
$inputs = array("c1_int" => array(-411114769, null, null, SQLSRV_SQLTYPE_INT),
"c2_tinyint" => array(198, null, null, SQLSRV_SQLTYPE_TINYINT),
"c3_smallint" => array(1378, null, null, SQLSRV_SQLTYPE_SMALLINT),
"c4_bigint" => array(140345831, null, null, SQLSRV_SQLTYPE_BIGINT),
"c5_varchar" => array("<22>@<40>a<EFBFBD>rêA*<2A><><EFBFBD>A>_hO<68>v@|h~O<<3C>+*<2A><>Cbaz<61>a<EFBFBD>Z/<2F><>:<3A><>u<EFBFBD><75>az<61><7A>Ah+u+r<>:| U*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_v<5F>@@~Ch<43><68>_<EFBFBD>*AA<41>B<EFBFBD><42>B,<2C>b<EFBFBD><62>.<2E>B+u*CAv<41>,<2C>><3E><>CU<<3C><><EFBFBD><EFBFBD>rz<72>@<40>r<EFBFBD>*<2A>ub<75>B<EFBFBD>a<EFBFBD>@<40>.<2E>Bv<42>o~ <20><>o o<>u/><3E><><EFBFBD>,<2C>,<2C>aO<61><4F>><3E>C:<3A>Z><3E><><EFBFBD><EFBFBD><<3C><>+<2B>r.bO.<2E>,uA<75>r><ov:,<2C><><EFBFBD><EFBFBD><EFBFBD>+<2B>./||CU<43><55>_<EFBFBD>Īh~<<3C>_<EFBFBD>/hb<68> ĩuBu<42><<3C>@bo<62><6F>B<EFBFBD>C<EFBFBD>A/<2F><>:<3A> <20>U<EFBFBD>*<2A>vu<76>.B<><42><EFBFBD>o_<6F>b<EFBFBD>r_<72><5F>><3E><>ܣB<DCA3>A<EFBFBD>va<76>v<EFBFBD><76>C<EFBFBD>U<EFBFBD> <20>v<EFBFBD>u<EFBFBD>><<3C><>UC*a<>U<EFBFBD>r<EFBFBD>hr+>|<7C><><EFBFBD>|o<>r<EFBFBD>У<<3C><<3C>|A<>oh<6F>A<EFBFBD>_vu~:~<7E><>h<EFBFBD>+<2B>Bu<42><75> <20>@Z+<2B>@h<><68><EFBFBD>|@bU<62>_<EFBFBD>/<2F> |:<3A>zb>@Uߩ <20><>o <20>@<40><>B<EFBFBD>_<EFBFBD>BOB<4F><42>hC<68>b~<7E>><3E><> r<><72><EFBFBD>Uzu<7A>rbz<62>/<2F><>U<EFBFBD><55><EFBFBD>u<EFBFBD>.<2E>@<40>__vBb<42>/<2F>r<EFBFBD><72>u<EFBFBD>z<EFBFBD><7A>*<2A><>/*<2A>O", null, null, SQLSRV_SQLTYPE_VARCHAR(512)));
$stmt = insertTest($conn1, $tableName, true, $inputs, $query);
} else {
$inputs = array("c1_int" => -411114769, "c2_tinyint" => 198, "c3_smallint" => 1378, "c4_bigint" => 140345831, "c5_varchar" => "<22>@<40>a<EFBFBD>rêA*<2A><><EFBFBD>A>_hO<68>v@|h~O<<3C>+*<2A><>Cbaz<61>a<EFBFBD>Z/<2F><>:<3A><>u<EFBFBD><75>az<61><7A>Ah+u+r<>:| U*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_v<5F>@@~Ch<43><68>_<EFBFBD>*AA<41>B<EFBFBD><42>B,<2C>b<EFBFBD><62>.<2E>B+u*CAv<41>,<2C>><3E><>CU<<3C><><EFBFBD><EFBFBD>rz<72>@<40>r<EFBFBD>*<2A>ub<75>B<EFBFBD>a<EFBFBD>@<40>.<2E>Bv<42>o~ <20><>o o<>u/><3E><><EFBFBD>,<2C>,<2C>aO<61><4F>><3E>C:<3A>Z><3E><><EFBFBD><EFBFBD><<3C><>+<2B>r.bO.<2E>,uA<75>r><ov:,<2C><><EFBFBD><EFBFBD><EFBFBD>+<2B>./||CU<43><55>_<EFBFBD>Īh~<<3C>_<EFBFBD>/hb<68> ĩuBu<42><<3C>@bo<62><6F>B<EFBFBD>C<EFBFBD>A/<2F><>:<3A> <20>U<EFBFBD>*<2A>vu<76>.B<><42><EFBFBD>o_<6F>b<EFBFBD>r_<72><5F>><3E><>ܣB<DCA3>A<EFBFBD>va<76>v<EFBFBD><76>C<EFBFBD>U<EFBFBD> <20>v<EFBFBD>u<EFBFBD>><<3C><>UC*a<>U<EFBFBD>r<EFBFBD>hr+>|<7C><><EFBFBD>|o<>r<EFBFBD>У<<3C><<3C>|A<>oh<6F>A<EFBFBD>_vu~:~<7E><>h<EFBFBD>+<2B>Bu<42><75> <20>@Z+<2B>@h<><68><EFBFBD>|@bU<62>_<EFBFBD>/<2F> |:<3A>zb>@Uߩ <20><>o <20>@<40><>B<EFBFBD>_<EFBFBD>BOB<4F><42>hC<68>b~<7E>><3E><> r<><72><EFBFBD>Uzu<7A>rbz<62>/<2F><>U<EFBFBD><55><EFBFBD>u<EFBFBD>.<2E>@<40>__vBb<42>/<2F>r<EFBFBD><72>u<EFBFBD>z<EFBFBD><7A>*<2A><>/*<2A>O");
$stmt = insertTest($conn1, $tableName, true, $inputs, $query);
}
2017-05-04 01:00:31 +02:00
$stmt1 = selectFromTable($conn1, $tableName);
$rowCount = rowCount($stmt1);
2017-05-04 01:00:31 +02:00
sqlsrv_free_stmt($stmt1);
if ($rowCount != 2) {
2017-05-04 01:00:31 +02:00
die("Table $tableName has $rowCount rows instead of 2.");
}
dropTable($conn1, $tableName);
2017-05-04 01:00:31 +02:00
sqlsrv_close($conn1);
endTest($testName);
2017-05-04 01:00:31 +02:00
}
function insertTest($conn, $tableName, $expectedOutcome, $inputs, $query = null)
2017-05-04 01:00:31 +02:00
{
$stmt = null;
if (!AE\isColEncrypted()) {
$insertSql = AE\getInsertSqlComplete($tableName, $inputs);
if (! is_null($query)) {
$sql = str_replace("SQL", $insertSql, $query);
} else {
$sql = $insertSql;
}
$stmt = sqlsrv_query($conn, $sql);
$actualOutcome = ($stmt !== false);
} else {
// must bind parameters
$insertSql = AE\getInsertSqlPlaceholders($tableName, $inputs);
$params = array();
foreach ($inputs as $key => $input) {
array_push($params, $inputs[$key]);
}
if (! is_null($query)) {
// this contains a batch of sql statements,
// with set identity_insert on or off
// thus, sqlsrv_query should be called
$sql = str_replace("SQL", $insertSql, $query);
$stmt = sqlsrv_query($conn, $sql, $params);
$actualOutcome = ($stmt !== false);
} else {
// just a regular insert, so use sqlsrv_prepare
$sql = $insertSql;
$actualOutcome = true;
$stmt = sqlsrv_prepare($conn, $sql, $params);
if ($stmt) {
$result = sqlsrv_execute($stmt);
$actualOutcome = ($result !== false);
}
}
2017-05-04 01:00:31 +02:00
}
if ($actualOutcome != $expectedOutcome) {
die("Unexpected execution outcome for \'$sql\'.");
2017-05-04 01:00:31 +02:00
}
}
try {
complexQuery();
} catch (Exception $e) {
echo $e->getMessage();
2017-05-04 01:00:31 +02:00
}
?>
--EXPECT--
Test "Statement - Complex Query" completed successfully.