fix double reclaring KSP function; fixed tests with emulate prepare or direct query
This commit is contained in:
parent
8f67a413aa
commit
5923b42727
|
@ -81,7 +81,7 @@ function getDSN($sqlsrvserver, $database, $keywords = '', $disableCE = false)
|
||||||
$dsn .= "ColumnEncryption=Enabled;";
|
$dsn .= "ColumnEncryption=Enabled;";
|
||||||
}
|
}
|
||||||
if ($keystore == "ksp" && !$disableCE) {
|
if ($keystore == "ksp" && !$disableCE) {
|
||||||
require('AE_Ksp.inc');
|
require_once('AE_Ksp.inc');
|
||||||
$ksp_path = getKSPPath();
|
$ksp_path = getKSPPath();
|
||||||
$dsn .= "CEKeystoreProvider=$ksp_path;CEKeystoreName=$ksp_name;CEKeystoreEncryptKey=$encrypt_key;";
|
$dsn .= "CEKeystoreProvider=$ksp_path;CEKeystoreName=$ksp_name;CEKeystoreEncryptKey=$encrypt_key;";
|
||||||
}
|
}
|
||||||
|
@ -523,6 +523,13 @@ function isColEncrypted()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function isAEConnected()
|
||||||
|
{
|
||||||
|
require('MsSetup.inc');
|
||||||
|
return $keystore != "none";
|
||||||
|
}
|
||||||
|
|
||||||
function teardown()
|
function teardown()
|
||||||
{
|
{
|
||||||
// TBD
|
// TBD
|
||||||
|
|
|
@ -8,11 +8,11 @@ require_once("MsCommon_mid-refactor.inc");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Connect
|
// Connect
|
||||||
$conn = connect();
|
$conn = connect();
|
||||||
|
|
||||||
// Create table
|
// Create table
|
||||||
$tableName = 'pdo_040test';
|
$tableName = 'pdo_040test';
|
||||||
// common function insertRow() is not used here since the test deliberately
|
// common function insertRow() is not used here since the test deliberately
|
||||||
// executes an invalid insertion statement
|
// executes an invalid insertion statement
|
||||||
// thus it's not necessary to create an encrypted column for testing column encryption
|
// thus it's not necessary to create an encrypted column for testing column encryption
|
||||||
$sql = "CREATE TABLE $tableName (code INT)";
|
$sql = "CREATE TABLE $tableName (code INT)";
|
||||||
|
@ -31,7 +31,7 @@ try {
|
||||||
} catch (PDOException $e) {
|
} catch (PDOException $e) {
|
||||||
$error = $e->errorInfo;
|
$error = $e->errorInfo;
|
||||||
$success = false;
|
$success = false;
|
||||||
if (!isColEncrypted()) {
|
if (!isAEConnected()) {
|
||||||
// 21S01 is the expected ODBC Column name or number of supplied values does not match table definition error
|
// 21S01 is the expected ODBC Column name or number of supplied values does not match table definition error
|
||||||
if ($error[0] === "21S01") {
|
if ($error[0] === "21S01") {
|
||||||
$success = true;
|
$success = true;
|
||||||
|
@ -41,7 +41,7 @@ try {
|
||||||
if ($error[0] === "07009") {
|
if ($error[0] === "07009") {
|
||||||
$success = true;
|
$success = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($success) {
|
if ($success) {
|
||||||
print "Done";
|
print "Done";
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -15,7 +15,7 @@ try {
|
||||||
// Always Encrypted does not support using DIRECT_QUERY for binding parameters
|
// Always Encrypted does not support using DIRECT_QUERY for binding parameters
|
||||||
// see https://github.com/Microsoft/msphpsql/wiki/Features#aebindparam
|
// see https://github.com/Microsoft/msphpsql/wiki/Features#aebindparam
|
||||||
$pdo_options = [];
|
$pdo_options = [];
|
||||||
if (!isColEncrypted()) {
|
if (!isAEConnected()) {
|
||||||
$pdo_options[PDO::SQLSRV_ATTR_DIRECT_QUERY] = true;
|
$pdo_options[PDO::SQLSRV_ATTR_DIRECT_QUERY] = true;
|
||||||
}
|
}
|
||||||
$pdo_options[PDO::ATTR_CURSOR] = PDO::CURSOR_SCROLL;
|
$pdo_options[PDO::ATTR_CURSOR] = PDO::CURSOR_SCROLL;
|
||||||
|
@ -35,13 +35,13 @@ try {
|
||||||
$st->execute(['p0' => $name]);
|
$st->execute(['p0' => $name]);
|
||||||
|
|
||||||
// Always Encrypted does not support emulate prepare
|
// Always Encrypted does not support emulate prepare
|
||||||
if (!isColEncrypted()) {
|
if (!isAEConnected()) {
|
||||||
$pdo_options[PDO::ATTR_EMULATE_PREPARES] = true;
|
$pdo_options[PDO::ATTR_EMULATE_PREPARES] = true;
|
||||||
}
|
}
|
||||||
$st = $connection->prepare("INSERT INTO $tbname (name) VALUES (:p0)", $pdo_options);
|
$st = $connection->prepare("INSERT INTO $tbname (name) VALUES (:p0)", $pdo_options);
|
||||||
$st->execute(['p0' => $name2]);
|
$st->execute(['p0' => $name2]);
|
||||||
|
|
||||||
if (!isColEncrypted()) {
|
if (!isAEConnected()) {
|
||||||
$statement1 = $connection->prepare("SELECT * FROM $tbname WHERE NAME LIKE :p0", $pdo_options);
|
$statement1 = $connection->prepare("SELECT * FROM $tbname WHERE NAME LIKE :p0", $pdo_options);
|
||||||
$statement1->execute(['p0' => "$prefix%"]);
|
$statement1->execute(['p0' => "$prefix%"]);
|
||||||
$pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;
|
$pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;
|
||||||
|
|
|
@ -11,13 +11,13 @@ Github 138. Test for Unicode Column Metadata.
|
||||||
* @param mixed $query
|
* @param mixed $query
|
||||||
* @return PDOStatement
|
* @return PDOStatement
|
||||||
*/
|
*/
|
||||||
function prepare($connection, $query) {
|
function prepare($connection, $query)
|
||||||
|
{
|
||||||
$pdo_options = array();
|
$pdo_options = array();
|
||||||
// emulate and binding parameter with direct query are not support in Always Encrypted
|
// emulate and binding parameter with direct query are not support in Always Encrypted
|
||||||
if ( !isColEncrypted() )
|
if (!isAEConnected()) {
|
||||||
{
|
$pdo_options[PDO::ATTR_EMULATE_PREPARES] = true;
|
||||||
$pdo_options[PDO::ATTR_EMULATE_PREPARES] = TRUE;
|
$pdo_options[PDO::SQLSRV_ATTR_DIRECT_QUERY] = true;
|
||||||
$pdo_options[PDO::SQLSRV_ATTR_DIRECT_QUERY] = TRUE;
|
|
||||||
}
|
}
|
||||||
$pdo_options[PDO::ATTR_CURSOR] = PDO::CURSOR_SCROLL;
|
$pdo_options[PDO::ATTR_CURSOR] = PDO::CURSOR_SCROLL;
|
||||||
$pdo_options[PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE] = PDO::SQLSRV_CURSOR_BUFFERED;
|
$pdo_options[PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE] = PDO::SQLSRV_CURSOR_BUFFERED;
|
||||||
|
@ -35,7 +35,7 @@ try {
|
||||||
|
|
||||||
// Create Table
|
// Create Table
|
||||||
$tbname = "mytáble";
|
$tbname = "mytáble";
|
||||||
createTable( $connection, $tbname, array( new ColumnMeta( "nchar(10)", "id" ), new ColumnMeta( "nchar(10)", "väriable" ), new ColumnMeta( "nchar(10)", "tésting" )));
|
createTable($connection, $tbname, array( new ColumnMeta("nchar(10)", "id"), new ColumnMeta("nchar(10)", "väriable"), new ColumnMeta("nchar(10)", "tésting")));
|
||||||
|
|
||||||
|
|
||||||
$query = "INSERT INTO $tbname (id, tésting, väriable) VALUES (:db_insert0, :db_insert1, :db_insert2)";
|
$query = "INSERT INTO $tbname (id, tésting, väriable) VALUES (:db_insert0, :db_insert1, :db_insert2)";
|
||||||
|
@ -55,9 +55,9 @@ try {
|
||||||
|
|
||||||
while ($row = $st->fetchAll()) {
|
while ($row = $st->fetchAll()) {
|
||||||
$row = reset($row);
|
$row = reset($row);
|
||||||
echo (isset($row['id']) ? "OK" : "FAIL") , "\n";
|
echo(isset($row['id']) ? "OK" : "FAIL") , "\n";
|
||||||
echo (isset($row['tésting']) ? "OK" : "FAIL") , "\n";
|
echo(isset($row['tésting']) ? "OK" : "FAIL") , "\n";
|
||||||
echo (isset($row['väriable']) ? "OK" : "FAIL") , "\n";
|
echo(isset($row['väriable']) ? "OK" : "FAIL") , "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
for ($i = 0; $i < $st->columnCount(); $i++) {
|
for ($i = 0; $i < $st->columnCount(); $i++) {
|
||||||
|
@ -79,4 +79,4 @@ OK
|
||||||
OK
|
OK
|
||||||
id
|
id
|
||||||
väriable
|
väriable
|
||||||
tésting
|
tésting
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,5 +1,5 @@
|
||||||
--TEST--
|
--TEST--
|
||||||
Test error from preparing a parameterized query with direct query or emulate prepare when Column Encryption is enabled
|
Test error from preparing a parameterized query with direct query or emulate prepare when Column Encryption is enabled
|
||||||
--SKIPIF--
|
--SKIPIF--
|
||||||
<?php require('skipif_mid-refactor.inc'); ?>
|
<?php require('skipif_mid-refactor.inc'); ?>
|
||||||
--FILE--
|
--FILE--
|
||||||
|
@ -21,7 +21,7 @@ try {
|
||||||
} catch (PDOException $e) {
|
} catch (PDOException $e) {
|
||||||
$error = $e->errorInfo;
|
$error = $e->errorInfo;
|
||||||
// expects an exception if Column Encryption is enabled
|
// expects an exception if Column Encryption is enabled
|
||||||
if (isColEncrypted()) {
|
if (isAEConnected()) {
|
||||||
if ($error[0] != "IMSSP" ||
|
if ($error[0] != "IMSSP" ||
|
||||||
$error[1] != -81 ||
|
$error[1] != -81 ||
|
||||||
$error[2] != "Parameterized statement with attribute PDO::SQLSRV_ATTR_DIRECT_QUERY is not supported in a Column Encryption enabled Connection.") {
|
$error[2] != "Parameterized statement with attribute PDO::SQLSRV_ATTR_DIRECT_QUERY is not supported in a Column Encryption enabled Connection.") {
|
||||||
|
@ -40,7 +40,7 @@ try {
|
||||||
} catch (PDOException $e) {
|
} catch (PDOException $e) {
|
||||||
$error = $e->errorInfo;
|
$error = $e->errorInfo;
|
||||||
// expects an exception if Column Encryption is enabled
|
// expects an exception if Column Encryption is enabled
|
||||||
if (isColEncrypted()) {
|
if (isAEConnected()) {
|
||||||
if ($error[0] != "IMSSP" ||
|
if ($error[0] != "IMSSP" ||
|
||||||
$error[1] != -82 ||
|
$error[1] != -82 ||
|
||||||
$error[2] != "Parameterized statement with attribute PDO::ATTR_EMULATE_PREPARES is not supported in a Column Encryption enabled Connection.") {
|
$error[2] != "Parameterized statement with attribute PDO::ATTR_EMULATE_PREPARES is not supported in a Column Encryption enabled Connection.") {
|
||||||
|
|
|
@ -35,7 +35,7 @@ try {
|
||||||
$cnn->exec("TRUNCATE TABLE $tbname");
|
$cnn->exec("TRUNCATE TABLE $tbname");
|
||||||
|
|
||||||
//EMULATE PREPARE with SQLSRV_ENCODING_BINARY
|
//EMULATE PREPARE with SQLSRV_ENCODING_BINARY
|
||||||
if (!isColEncrypted()) {
|
if (!isAEConnected()) {
|
||||||
// Emulate prepare does not work fro encrypted columns
|
// Emulate prepare does not work fro encrypted columns
|
||||||
$pdo_options[PDO::ATTR_EMULATE_PREPARES] = true;
|
$pdo_options[PDO::ATTR_EMULATE_PREPARES] = true;
|
||||||
}
|
}
|
||||||
|
@ -59,10 +59,10 @@ try {
|
||||||
$st->bindParam(':p0', $p, PDO::PARAM_LOB);
|
$st->bindParam(':p0', $p, PDO::PARAM_LOB);
|
||||||
$st->execute();
|
$st->execute();
|
||||||
$error = $st->errorInfo();
|
$error = $st->errorInfo();
|
||||||
if (!isColEncrypted() && $error[0] !== "42000") {
|
if (!isAEConnected() && $error[0] !== "42000") {
|
||||||
echo "Error 42000 is expected: Implicit conversion from data type varchar to varbinary(max) is not allowed.\n";
|
echo "Error 42000 is expected: Implicit conversion from data type varchar to varbinary(max) is not allowed.\n";
|
||||||
var_dump($error);
|
var_dump($error);
|
||||||
} elseif (isColEncrypted() && $error[0] != "22018") {
|
} elseif (isAEConnected() && $error[0] != "22018") {
|
||||||
echo "Error 22018 is expected: Invalid character value for cast specification.\n";
|
echo "Error 22018 is expected: Invalid character value for cast specification.\n";
|
||||||
var_dump($error);
|
var_dump($error);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -30,7 +30,7 @@ try {
|
||||||
|
|
||||||
//prepare with emulate prepare and no bind param options
|
//prepare with emulate prepare and no bind param options
|
||||||
print_r("Prepare with emulate prepare and no bindParam options:\n");
|
print_r("Prepare with emulate prepare and no bindParam options:\n");
|
||||||
if (!isColEncrypted()) {
|
if (!isAEConnected()) {
|
||||||
$options = array(PDO::ATTR_EMULATE_PREPARES => true);
|
$options = array(PDO::ATTR_EMULATE_PREPARES => true);
|
||||||
}
|
}
|
||||||
$stmt = $conn->prepare($query, $options);
|
$stmt = $conn->prepare($query, $options);
|
||||||
|
|
|
@ -29,7 +29,7 @@ try {
|
||||||
print_r($row);
|
print_r($row);
|
||||||
|
|
||||||
//with emulate prepare and no bind param options
|
//with emulate prepare and no bind param options
|
||||||
if (!isColEncrypted()) {
|
if (!isAEConnected()) {
|
||||||
// emulate prepare is not supported in encrypted columns
|
// emulate prepare is not supported in encrypted columns
|
||||||
$options = array(PDO::ATTR_EMULATE_PREPARES => true);
|
$options = array(PDO::ATTR_EMULATE_PREPARES => true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ try {
|
||||||
$conn = connect("", array(), PDO::ERRMODE_SILENT);
|
$conn = connect("", array(), PDO::ERRMODE_SILENT);
|
||||||
|
|
||||||
$tableName = "number_types";
|
$tableName = "number_types";
|
||||||
if (!isColEncrypted()) {
|
if (!isAEConnected()) {
|
||||||
createTable($conn, $tableName, array("c1_decimal" => "decimal", "c2_money" => "money", "c3_float" => "float"));
|
createTable($conn, $tableName, array("c1_decimal" => "decimal", "c2_money" => "money", "c3_float" => "float"));
|
||||||
} else {
|
} else {
|
||||||
// money is not supported for column encryption, use decimal(19,4) instead
|
// money is not supported for column encryption, use decimal(19,4) instead
|
||||||
|
@ -35,7 +35,7 @@ try {
|
||||||
|
|
||||||
//with emulate prepare and no bind param options
|
//with emulate prepare and no bind param options
|
||||||
print_r("Prepare with emulate prepare and no bind param options:\n");
|
print_r("Prepare with emulate prepare and no bind param options:\n");
|
||||||
if (!isColEncrypted()) {
|
if (!isAEConnected()) {
|
||||||
// emulate prepare is not supported for encrypted columns
|
// emulate prepare is not supported for encrypted columns
|
||||||
$options = array(PDO::ATTR_EMULATE_PREPARES => true);
|
$options = array(PDO::ATTR_EMULATE_PREPARES => true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ try {
|
||||||
$conn = connect("", array(), PDO::ERRMODE_SILENT);
|
$conn = connect("", array(), PDO::ERRMODE_SILENT);
|
||||||
|
|
||||||
$tableName = "number_types";
|
$tableName = "number_types";
|
||||||
if (!isColEncrypted()) {
|
if (!isAEConnected()) {
|
||||||
createTable($conn, $tableName, array("c1_decimal" => "decimal", "c2_money" => "money", "c3_float" => "float"));
|
createTable($conn, $tableName, array("c1_decimal" => "decimal", "c2_money" => "money", "c3_float" => "float"));
|
||||||
} else {
|
} else {
|
||||||
// money is not supported for column encryption, use decimal(19,4) instead
|
// money is not supported for column encryption, use decimal(19,4) instead
|
||||||
|
@ -35,7 +35,7 @@ try {
|
||||||
|
|
||||||
//with emulate prepare and no bind param options
|
//with emulate prepare and no bind param options
|
||||||
print_r("Prepare with emulate prepare and no bind param options:\n");
|
print_r("Prepare with emulate prepare and no bind param options:\n");
|
||||||
if (!isColEncrypted()) {
|
if (!isAEConnected()) {
|
||||||
// emulate prepare is not supported for encrypted columns
|
// emulate prepare is not supported for encrypted columns
|
||||||
$options = array(PDO::ATTR_EMULATE_PREPARES => true);
|
$options = array(PDO::ATTR_EMULATE_PREPARES => true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,7 @@ try {
|
||||||
|
|
||||||
// prepare with emulate prepare
|
// prepare with emulate prepare
|
||||||
print_r("Prepare with emulate prepare and no bindParam options:\n");
|
print_r("Prepare with emulate prepare and no bindParam options:\n");
|
||||||
if (!isColEncrypted()) {
|
if (!isAEConnected()) {
|
||||||
// emulate prepare is not supported for encrypted columns
|
// emulate prepare is not supported for encrypted columns
|
||||||
$options = array(PDO::ATTR_EMULATE_PREPARES => true);
|
$options = array(PDO::ATTR_EMULATE_PREPARES => true);
|
||||||
}
|
}
|
||||||
|
@ -39,7 +39,7 @@ try {
|
||||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
print_r($row);
|
print_r($row);
|
||||||
|
|
||||||
if (!isColEncrypted()) {
|
if (!isAEConnected()) {
|
||||||
// without emulate prepare, binding PARAM_INT with SQLSRV_ENCODING_SYSTEM is not allowed
|
// without emulate prepare, binding PARAM_INT with SQLSRV_ENCODING_SYSTEM is not allowed
|
||||||
// thus the following will not be tested when Column Encryption is enabled
|
// thus the following will not be tested when Column Encryption is enabled
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ try {
|
||||||
$conn = connect("", array(), PDO::ERRMODE_SILENT);
|
$conn = connect("", array(), PDO::ERRMODE_SILENT);
|
||||||
|
|
||||||
$tableName = "number_types";
|
$tableName = "number_types";
|
||||||
if (!isColEncrypted()) {
|
if (!isAEConnected()) {
|
||||||
createTable($conn, $tableName, array("c1_decimal" => "decimal", "c2_money" => "money", "c3_float" => "float"));
|
createTable($conn, $tableName, array("c1_decimal" => "decimal", "c2_money" => "money", "c3_float" => "float"));
|
||||||
} else {
|
} else {
|
||||||
// money is not supported for column encryption, use decimal(19,4) instead
|
// money is not supported for column encryption, use decimal(19,4) instead
|
||||||
|
@ -35,7 +35,7 @@ try {
|
||||||
|
|
||||||
//with emulate prepare and no bind param options
|
//with emulate prepare and no bind param options
|
||||||
print_r("Prepare with emulate prepare and no bind param options:\n");
|
print_r("Prepare with emulate prepare and no bind param options:\n");
|
||||||
if (!isColEncrypted()) {
|
if (!isAEConnected()) {
|
||||||
// emulate prepare is not supported for encrypted columns
|
// emulate prepare is not supported for encrypted columns
|
||||||
$options = array(PDO::ATTR_EMULATE_PREPARES => true);
|
$options = array(PDO::ATTR_EMULATE_PREPARES => true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,7 @@ try {
|
||||||
|
|
||||||
//with emulate prepare and no bind param options
|
//with emulate prepare and no bind param options
|
||||||
print_r("Prepare with emulate prepare and no bindParam options:\n");
|
print_r("Prepare with emulate prepare and no bindParam options:\n");
|
||||||
if (!isColEncrypted()) {
|
if (!isAEConnected()) {
|
||||||
$options = array(PDO::ATTR_EMULATE_PREPARES => true);
|
$options = array(PDO::ATTR_EMULATE_PREPARES => true);
|
||||||
} else {
|
} else {
|
||||||
$options = array(PDO::ATTR_EMULATE_PREPARES => false);
|
$options = array(PDO::ATTR_EMULATE_PREPARES => false);
|
||||||
|
|
Loading…
Reference in a new issue