From 36fef1329729d2e6047017c4a1d9a7f7d2d2c1f4 Mon Sep 17 00:00:00 2001 From: v-kaywon Date: Tue, 19 Sep 2017 12:48:21 -0700 Subject: [PATCH 1/6] fix handling decimal type with no decimal with always encrypted --- source/shared/core_stmt.cpp | 3 +++ test/functional/pdo_sqlsrv/skipif_versions_old.inc | 2 +- test/functional/sqlsrv/skipif_versions_old.inc | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/source/shared/core_stmt.cpp b/source/shared/core_stmt.cpp index cb24cb18..3398ed59 100644 --- a/source/shared/core_stmt.cpp +++ b/source/shared/core_stmt.cpp @@ -440,6 +440,9 @@ void core_sqlsrv_bind_param( _Inout_ sqlsrv_stmt* stmt, _In_ SQLUSMALLINT param_ if ( stmt->conn->ce_option.enabled && ( sql_type == SQL_UNKNOWN_TYPE || column_size == SQLSRV_UNKNOWN_SIZE )) { ae_get_sql_type_info( stmt, param_num, direction, param_z, encoding, sql_type, column_size, decimal_digits TSRMLS_CC ); + // change long to double if the sql type is decimal + if ( sql_type == SQL_DECIMAL && Z_TYPE_P( param_z ) == IS_LONG ) + convert_to_double( param_z ); } else { // if the sql type is unknown, then set the default based on the PHP type passed in diff --git a/test/functional/pdo_sqlsrv/skipif_versions_old.inc b/test/functional/pdo_sqlsrv/skipif_versions_old.inc index dce5e21f..b6f0a5a4 100644 --- a/test/functional/pdo_sqlsrv/skipif_versions_old.inc +++ b/test/functional/pdo_sqlsrv/skipif_versions_old.inc @@ -6,7 +6,7 @@ if (! extension_loaded( 'pdo' ) || ! extension_loaded( 'pdo_sqlsrv' )) require_once( "MsSetup.inc" ); require_once( "MsCommon.inc" ); -$conn = new PDO( "sqlsrv:server = $server;", $uid, $pwd ); +$conn = ae_connect(); if( ! $conn ) { echo( "Error: could not connect during SKIPIF!" ); diff --git a/test/functional/sqlsrv/skipif_versions_old.inc b/test/functional/sqlsrv/skipif_versions_old.inc index 50ae84d8..8ae712c7 100644 --- a/test/functional/sqlsrv/skipif_versions_old.inc +++ b/test/functional/sqlsrv/skipif_versions_old.inc @@ -4,7 +4,7 @@ if(! extension_loaded( "sqlsrv" ) ) die( "skip extension not loaded" ); require_once( "MsCommon.inc" ); -$conn = Connect(); +$conn = ae_connect(); if( ! $conn ) { echo( "Error: could not connect during SKIPIF!" ); From e612621b5ab9e778577d911f7a3b7286d3396b34 Mon Sep 17 00:00:00 2001 From: v-kaywon Date: Tue, 19 Sep 2017 16:38:12 -0700 Subject: [PATCH 2/6] change compatible types list for sqltype in binding param and column datatypes --- .../sqlsrv_ae_insert_sqltype_datetime.phpt | 15 +++++++------- .../sqlsrv_ae_insert_sqltype_money.phpt | 6 +++--- .../sqlsrv_ae_insert_sqltype_numeric.phpt | 20 +++++++++---------- .../sqlsrv_ae_insert_sqltype_string.phpt | 12 +++++------ 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_datetime.phpt b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_datetime.phpt index 27c7a28b..e46dbcf9 100644 --- a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_datetime.phpt +++ b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_datetime.phpt @@ -10,12 +10,13 @@ include 'AEData.inc'; date_default_timezone_set("Canada/Pacific"); $dataTypes = array( "date", "datetime", "datetime2", "smalldatetime", "time", "datetimeoffset" ); -$compatList = array( "date" => array( "SQLSRV_SQLTYPE_DATE", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_DATETIME2", "SQLSRV_SQLTYPE_DATETIMEOFFSET", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_VARCHAR"), - "datetime" => array( "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_DATETIME2", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_TIME", "SQLSRV_SQLTYPE_VARCHAR"), - "datetime2" => array( "SQLSRV_SQLTYPE_DATETIME2", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_TIME", "SQLSRV_SQLTYPE_VARCHAR"), - "smalldatetime" => array( "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_DATETIME2", "SQLSRV_SQLTYPE_DATETIMEOFFSET", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_TIME", "SQLSRV_SQLTYPE_VARCHAR" ), - "time" => array( "SQLSRV_SQLTYPE_DATETIME2", "SQLSRV_SQLTYPE_DATETIMEOFFSET", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_TIME", "SQLSRV_SQLTYPE_VARCHAR" ), - "datetimeoffset" => array( "SQLSRV_SQLTYPE_DATETIME2", "SQLSRV_SQLTYPE_DATETIMEOFFSET", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_TIME", "SQLSRV_SQLTYPE_VARCHAR" )); + +$compatList = array( "date" => array( "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DATE", "SQLSRV_SQLTYPE_DATETIMEOFFSET", "SQLSRV_SQLTYPE_DATETIME2" ), + "datetime" => array( "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DATE", "SQLSRV_SQLTYPE_TIME", "SQLSRV_SQLTYPE_DATETIMEOFFSET", "SQLSRV_SQLTYPE_DATETIME2" ), + "datetime2" => array( "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DATE", "SQLSRV_SQLTYPE_TIME", "SQLSRV_SQLTYPE_DATETIMEOFFSET", "SQLSRV_SQLTYPE_DATETIME2" ), + "smalldatetime" => array( "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DATE", "SQLSRV_SQLTYPE_TIME", "SQLSRV_SQLTYPE_DATETIMEOFFSET", "SQLSRV_SQLTYPE_DATETIME2" ), + "time" => array( "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_TIME", "SQLSRV_SQLTYPE_DATETIMEOFFSET", "SQLSRV_SQLTYPE_DATETIME2" ), + "datetimeoffset" => array("SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DATE", "SQLSRV_SQLTYPE_TIME", "SQLSRV_SQLTYPE_DATETIMEOFFSET", "SQLSRV_SQLTYPE_DATETIME2") ); $conn = ae_connect(); @@ -48,7 +49,7 @@ foreach ( $dataTypes as $dataType ) { if ( $compatType == $sqlType ) $isCompat = true; } - if ( $isCompat ) + if ( $isCompat && sqlsrv_errors()[0]['SQLSTATE'] == 22018 ) { echo "$sqlType should be compatible with $dataType\n"; $success = false; diff --git a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_money.phpt b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_money.phpt index f0ee7f74..c569a2ff 100644 --- a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_money.phpt +++ b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_money.phpt @@ -9,8 +9,8 @@ include 'MsCommon.inc'; include 'AEData.inc'; $dataTypes = array( "smallmoney", "money" ); -$compatList = array( "smallmoney" => array( 'SQLSRV_SQLTYPE_CHAR', 'SQLSRV_SQLTYPE_DECIMAL', 'SQLSRV_SQLTYPE_FLOAT', 'SQLSRV_SQLTYPE_MONEY', 'SQLSRV_SQLTYPE_NCHAR', 'SQLSRV_SQLTYPE_NUMERIC', 'SQLSRV_SQLTYPE_NVARCHAR', 'SQLSRV_SQLTYPE_REAL', 'SQLSRV_SQLTYPE_SMALLMONEY', 'SQLSRV_SQLTYPE_VARCHAR' ), - "money" => array( 'SQLSRV_SQLTYPE_BIGINT', 'SQLSRV_SQLTYPE_CHAR', 'SQLSRV_SQLTYPE_DECIMAL', 'SQLSRV_SQLTYPE_FLOAT', 'SQLSRV_SQLTYPE_MONEY', 'SQLSRV_SQLTYPE_NCHAR', 'SQLSRV_SQLTYPE_NUMERIC', 'SQLSRV_SQLTYPE_NVARCHAR', 'SQLSRV_SQLTYPE_REAL', 'SQLSRV_SQLTYPE_VARCHAR' )); +$compatList = array( "smallmoney" => array( "SQLSRV_SQLTYPE_BINARY", "SQLSRV_SQLTYPE_VARBINARY", "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DECIMAL(18,5)", "SQLSRV_SQLTYPE_NUMERIC(10,5)", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_BIGINT", "SQLSRV_SQLTYPE_INT", "SQLSRV_SQLTYPE_SMALLINT", "SQLSRV_SQLTYPE_TINYINT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_SMALLMONEY", "SQLSRV_SQLTYPE_BIT", "SQLSRV_SQLTYPE_TIMESTAMP" ), + "money" => array( "SQLSRV_SQLTYPE_BINARY", "SQLSRV_SQLTYPE_VARBINARY", "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DECIMAL(18,5)", "SQLSRV_SQLTYPE_NUMERIC(10,5)", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_BIGINT", "SQLSRV_SQLTYPE_INT", "SQLSRV_SQLTYPE_SMALLINT", "SQLSRV_SQLTYPE_TINYINT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_SMALLMONEY", "SQLSRV_SQLTYPE_BIT", "SQLSRV_SQLTYPE_TIMESTAMP" )); $conn = ae_connect(); @@ -43,7 +43,7 @@ foreach ( $dataTypes as $dataType ) { if ( stripos( $compatType, $sqlType ) !== false ) $isCompat = true; } - if ( $isCompat ) + if ( $isCompat && sqlsrv_errors()[0]['SQLSTATE'] == 22018 ) { echo "$sqlType should be compatible with $dataType\n"; $success = false; diff --git a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_numeric.phpt b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_numeric.phpt index 0a944aef..bcdd6891 100644 --- a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_numeric.phpt +++ b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_numeric.phpt @@ -9,15 +9,15 @@ include 'MsCommon.inc'; include 'AEData.inc'; $dataTypes = array( "bit", "tinyint", "smallint", "int", "bigint", "decimal(18,5)", "numeric(10,5)", "float", "real" ); -$compatList = array( "bit" => array( "SQLSRV_SQLTYPE_BIGINT", "SQLSRV_SQLTYPE_BIT", "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_DECIMAL", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_INT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NUMERIC", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_SMALLINT", "SQLSRV_SQLTYPE_SMALLMONEY", "SQLSRV_SQLTYPE_TINYINT", "SQLSRV_SQLTYPE_VARCHAR"), - "tinyint" => array( "SQLSRV_SQLTYPE_BIGINT", "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_DECIMAL", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_INT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NUMERIC", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_SMALLINT", "SQLSRV_SQLTYPE_SMALLMONEY", "SQLSRV_SQLTYPE_TINYINT", "SQLSRV_SQLTYPE_VARCHAR"), - "smallint" => array( "SQLSRV_SQLTYPE_BIGINT", "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_DECIMAL", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_INT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NUMERIC", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_SMALLINT", "SQLSRV_SQLTYPE_SMALLMONEY", "SQLSRV_SQLTYPE_VARCHAR"), - "int" => array( "SQLSRV_SQLTYPE_BIGINT", "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_DECIMAL", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_INT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_VARCHAR"), - "bigint" => array( "SQLSRV_SQLTYPE_BIGINT", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_REAL"), - "decimal(18,5)" => array( "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_DECIMAL", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_VARCHAR"), - "numeric(10,5)" => array( "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_DECIMAL", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NUMERIC", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_SMALLMONEY", "SQLSRV_SQLTYPE_VARCHAR"), - "float" => array( "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_DECIMAL", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_VARCHAR"), - "real" => array( "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_DECIMAL", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NUMERIC", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_SMALLMONEY", "SQLSRV_SQLTYPE_VARCHAR" )); +$compatList = array( "bit" => array( "SQLSRV_SQLTYPE_BINARY", "SQLSRV_SQLTYPE_VARBINARY", "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DECIMAL(18,5)", "SQLSRV_SQLTYPE_NUMERIC(10,5)", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_BIGINT", "SQLSRV_SQLTYPE_INT", "SQLSRV_SQLTYPE_SMALLINT", "SQLSRV_SQLTYPE_TINYINT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_SMALLMONEY", "SQLSRV_SQLTYPE_BIT", "SQLSRV_SQLTYPE_TIMESTAMP" ), + "tinyint" => array( "SQLSRV_SQLTYPE_BINARY", "SQLSRV_SQLTYPE_VARBINARY", "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DECIMAL(18,5)", "SQLSRV_SQLTYPE_NUMERIC(10,5)", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_BIGINT", "SQLSRV_SQLTYPE_INT", "SQLSRV_SQLTYPE_SMALLINT", "SQLSRV_SQLTYPE_TINYINT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_SMALLMONEY", "SQLSRV_SQLTYPE_BIT", "SQLSRV_SQLTYPE_TIMESTAMP" ), + "smallint" => array( "SQLSRV_SQLTYPE_BINARY", "SQLSRV_SQLTYPE_VARBINARY", "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DECIMAL(18,5)", "SQLSRV_SQLTYPE_NUMERIC(10,5)", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_BIGINT", "SQLSRV_SQLTYPE_INT", "SQLSRV_SQLTYPE_SMALLINT", "SQLSRV_SQLTYPE_TINYINT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_SMALLMONEY", "SQLSRV_SQLTYPE_BIT", "SQLSRV_SQLTYPE_TIMESTAMP" ), + "int" => array( "SQLSRV_SQLTYPE_BINARY", "SQLSRV_SQLTYPE_VARBINARY", "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DECIMAL(18,5)", "SQLSRV_SQLTYPE_NUMERIC(10,5)", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_BIGINT", "SQLSRV_SQLTYPE_INT", "SQLSRV_SQLTYPE_SMALLINT", "SQLSRV_SQLTYPE_TINYINT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_SMALLMONEY", "SQLSRV_SQLTYPE_BIT", "SQLSRV_SQLTYPE_TIMESTAMP" ), + "bigint" => array( "SQLSRV_SQLTYPE_BINARY", "SQLSRV_SQLTYPE_VARBINARY", "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DECIMAL(18,5)", "SQLSRV_SQLTYPE_NUMERIC(10,5)", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_BIGINT", "SQLSRV_SQLTYPE_INT", "SQLSRV_SQLTYPE_SMALLINT", "SQLSRV_SQLTYPE_TINYINT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_SMALLMONEY", "SQLSRV_SQLTYPE_BIT", "SQLSRV_SQLTYPE_TIMESTAMP" ), + "decimal(18,5)" => array( "SQLSRV_SQLTYPE_BINARY", "SQLSRV_SQLTYPE_VARBINARY", "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DECIMAL(18,5)", "SQLSRV_SQLTYPE_NUMERIC(10,5)", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_BIGINT", "SQLSRV_SQLTYPE_INT", "SQLSRV_SQLTYPE_SMALLINT", "SQLSRV_SQLTYPE_TINYINT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_SMALLMONEY", "SQLSRV_SQLTYPE_BIT", "SQLSRV_SQLTYPE_TIMESTAMP" ), + "numeric(10,5)" => array( "SQLSRV_SQLTYPE_BINARY", "SQLSRV_SQLTYPE_VARBINARY", "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DECIMAL(18,5)", "SQLSRV_SQLTYPE_NUMERIC(10,5)", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_BIGINT", "SQLSRV_SQLTYPE_INT", "SQLSRV_SQLTYPE_SMALLINT", "SQLSRV_SQLTYPE_TINYINT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_SMALLMONEY", "SQLSRV_SQLTYPE_BIT", "SQLSRV_SQLTYPE_TIMESTAMP" ), + "float" => array( "SQLSRV_SQLTYPE_BINARY", "SQLSRV_SQLTYPE_VARBINARY", "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DECIMAL(18,5)", "SQLSRV_SQLTYPE_NUMERIC(10,5)", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_BIGINT", "SQLSRV_SQLTYPE_INT", "SQLSRV_SQLTYPE_SMALLINT", "SQLSRV_SQLTYPE_TINYINT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_SMALLMONEY", "SQLSRV_SQLTYPE_BIT" ), + "real" => array( "SQLSRV_SQLTYPE_BINARY", "SQLSRV_SQLTYPE_VARBINARY", "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DECIMAL(18,5)", "SQLSRV_SQLTYPE_NUMERIC(10,5)", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_BIGINT", "SQLSRV_SQLTYPE_INT", "SQLSRV_SQLTYPE_SMALLINT", "SQLSRV_SQLTYPE_TINYINT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_SMALLMONEY", "SQLSRV_SQLTYPE_BIT" )); $epsilon = 0.0001; $conn = ae_connect(); @@ -51,7 +51,7 @@ foreach ( $dataTypes as $dataType ) { if ( stripos( $compatType, $sqlType ) !== false ) $isCompat = true; } - if ( $isCompat ) + if ( $isCompat && sqlsrv_errors()[0]['SQLSTATE'] == 22018 ) { echo "$sqlType should be compatible with $dataType\n"; $success = false; diff --git a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_string.phpt b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_string.phpt index 910a0da7..a77dd099 100644 --- a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_string.phpt +++ b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_string.phpt @@ -9,11 +9,11 @@ include 'MsCommon.inc'; include 'AEData.inc'; $dataTypes = array( "char(5)", "varchar(max)", "nchar(5)", "nvarchar(max)" ); -$compatList = array( "char(5)" => array( "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_NTEXT", "SQLSRV_SQLTYPE_TEXT", "SQLSRV_SQLTYPE_VARCHAR"), - "varchar(max)" => array( "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_NTEXT", "SQLSRV_SQLTYPE_TEXT", "SQLSRV_SQLTYPE_VARCHAR"), - "nchar(5)" => array( "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_NTEXT", "SQLSRV_SQLTYPE_TEXT", "SQLSRV_SQLTYPE_VARCHAR"), - "nvarchar(max)" => array( "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_NTEXT", "SQLSRV_SQLTYPE_TEXT", "SQLSRV_SQLTYPE_VARCHAR" )); - +$compatList = array( "char(5)" => array( "SQLSRV_SQLTYPE_CHAR(5)", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR(5)", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DECIMAL", "SQLSRV_SQLTYPE_NUMERIC", "SQLSRV_SQLTYPE_NTEXT", "SQLSRV_SQLTYPE_TEXT", "SQLSRV_SQLTYPE_XML" ), + "varchar(max)" => array( "SQLSRV_SQLTYPE_CHAR(5)", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR(5)", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DECIMAL", "SQLSRV_SQLTYPE_NUMERIC", "SQLSRV_SQLTYPE_NTEXT", "SQLSRV_SQLTYPE_TEXT", "SQLSRV_SQLTYPE_XML" ), + "nchar(5)" => array( "SQLSRV_SQLTYPE_CHAR(5)", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR(5)", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DECIMAL", "SQLSRV_SQLTYPE_NUMERIC", "SQLSRV_SQLTYPE_NTEXT", "SQLSRV_SQLTYPE_TEXT", "SQLSRV_SQLTYPE_XML" ), + "nvarchar(max)" => array( "SQLSRV_SQLTYPE_CHAR(5)", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR(5)", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DECIMAL", "SQLSRV_SQLTYPE_NUMERIC", "SQLSRV_SQLTYPE_NTEXT", "SQLSRV_SQLTYPE_TEXT", "SQLSRV_SQLTYPE_XML" )); + $conn = ae_connect(); foreach ( $dataTypes as $dataType ) { @@ -45,7 +45,7 @@ foreach ( $dataTypes as $dataType ) { if ( stripos( $compatType, $sqlType ) !== false ) $isCompat = true; } - if ( $isCompat ) + if ( $isCompat && sqlsrv_errors()[0]['SQLSTATE'] == 22018 ) { echo "$sqlType should be compatible with $dataType\n"; $success = false; From d72504b7306b60d134c661cb1a5635cd9e0e927c Mon Sep 17 00:00:00 2001 From: v-kaywon Date: Thu, 21 Sep 2017 15:48:48 -0700 Subject: [PATCH 3/6] add comments to sqltype compatibility tests --- test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_datetime.phpt | 3 +++ test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_money.phpt | 3 +++ test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_numeric.phpt | 4 ++++ test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_string.phpt | 4 ++++ 4 files changed, 14 insertions(+) diff --git a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_datetime.phpt b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_datetime.phpt index e46dbcf9..e1b56821 100644 --- a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_datetime.phpt +++ b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_datetime.phpt @@ -11,6 +11,7 @@ include 'AEData.inc'; date_default_timezone_set("Canada/Pacific"); $dataTypes = array( "date", "datetime", "datetime2", "smalldatetime", "time", "datetimeoffset" ); +// this is a list of implicit datatype conversion that SQL Server allows (https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-type-conversion-database-engine) $compatList = array( "date" => array( "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DATE", "SQLSRV_SQLTYPE_DATETIMEOFFSET", "SQLSRV_SQLTYPE_DATETIME2" ), "datetime" => array( "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DATE", "SQLSRV_SQLTYPE_TIME", "SQLSRV_SQLTYPE_DATETIMEOFFSET", "SQLSRV_SQLTYPE_DATETIME2" ), "datetime2" => array( "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DATE", "SQLSRV_SQLTYPE_TIME", "SQLSRV_SQLTYPE_DATETIMEOFFSET", "SQLSRV_SQLTYPE_DATETIME2" ), @@ -49,6 +50,7 @@ foreach ( $dataTypes as $dataType ) { if ( $compatType == $sqlType ) $isCompat = true; } + // 22018 is the SQLSTATE for any incompatible conversion errors if ( $isCompat && sqlsrv_errors()[0]['SQLSTATE'] == 22018 ) { echo "$sqlType should be compatible with $dataType\n"; @@ -60,6 +62,7 @@ foreach ( $dataTypes as $dataType ) { { if ( $r === false ) { + // always encrypted only allow sqlType that is identical to the encrypted column datatype if ( "SQLSRV_SQLTYPE_" . strtoupper( $dataType ) == $sqlType ) { echo "$sqlType should be compatible with $dataType\n"; diff --git a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_money.phpt b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_money.phpt index c569a2ff..cf4d0f2a 100644 --- a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_money.phpt +++ b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_money.phpt @@ -9,6 +9,8 @@ include 'MsCommon.inc'; include 'AEData.inc'; $dataTypes = array( "smallmoney", "money" ); + +// this is a list of implicit datatype conversion that SQL Server allows (https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-type-conversion-database-engine) $compatList = array( "smallmoney" => array( "SQLSRV_SQLTYPE_BINARY", "SQLSRV_SQLTYPE_VARBINARY", "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DECIMAL(18,5)", "SQLSRV_SQLTYPE_NUMERIC(10,5)", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_BIGINT", "SQLSRV_SQLTYPE_INT", "SQLSRV_SQLTYPE_SMALLINT", "SQLSRV_SQLTYPE_TINYINT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_SMALLMONEY", "SQLSRV_SQLTYPE_BIT", "SQLSRV_SQLTYPE_TIMESTAMP" ), "money" => array( "SQLSRV_SQLTYPE_BINARY", "SQLSRV_SQLTYPE_VARBINARY", "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DECIMAL(18,5)", "SQLSRV_SQLTYPE_NUMERIC(10,5)", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_BIGINT", "SQLSRV_SQLTYPE_INT", "SQLSRV_SQLTYPE_SMALLINT", "SQLSRV_SQLTYPE_TINYINT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_SMALLMONEY", "SQLSRV_SQLTYPE_BIT", "SQLSRV_SQLTYPE_TIMESTAMP" )); @@ -43,6 +45,7 @@ foreach ( $dataTypes as $dataType ) { if ( stripos( $compatType, $sqlType ) !== false ) $isCompat = true; } + // 22018 is the SQLSTATE for any incompatible conversion errors if ( $isCompat && sqlsrv_errors()[0]['SQLSTATE'] == 22018 ) { echo "$sqlType should be compatible with $dataType\n"; diff --git a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_numeric.phpt b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_numeric.phpt index bcdd6891..5218181b 100644 --- a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_numeric.phpt +++ b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_numeric.phpt @@ -9,6 +9,8 @@ include 'MsCommon.inc'; include 'AEData.inc'; $dataTypes = array( "bit", "tinyint", "smallint", "int", "bigint", "decimal(18,5)", "numeric(10,5)", "float", "real" ); + +// this is a list of implicit datatype conversion that SQL Server allows (https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-type-conversion-database-engine) $compatList = array( "bit" => array( "SQLSRV_SQLTYPE_BINARY", "SQLSRV_SQLTYPE_VARBINARY", "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DECIMAL(18,5)", "SQLSRV_SQLTYPE_NUMERIC(10,5)", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_BIGINT", "SQLSRV_SQLTYPE_INT", "SQLSRV_SQLTYPE_SMALLINT", "SQLSRV_SQLTYPE_TINYINT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_SMALLMONEY", "SQLSRV_SQLTYPE_BIT", "SQLSRV_SQLTYPE_TIMESTAMP" ), "tinyint" => array( "SQLSRV_SQLTYPE_BINARY", "SQLSRV_SQLTYPE_VARBINARY", "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DECIMAL(18,5)", "SQLSRV_SQLTYPE_NUMERIC(10,5)", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_BIGINT", "SQLSRV_SQLTYPE_INT", "SQLSRV_SQLTYPE_SMALLINT", "SQLSRV_SQLTYPE_TINYINT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_SMALLMONEY", "SQLSRV_SQLTYPE_BIT", "SQLSRV_SQLTYPE_TIMESTAMP" ), "smallint" => array( "SQLSRV_SQLTYPE_BINARY", "SQLSRV_SQLTYPE_VARBINARY", "SQLSRV_SQLTYPE_CHAR", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DATETIME", "SQLSRV_SQLTYPE_SMALLDATETIME", "SQLSRV_SQLTYPE_DECIMAL(18,5)", "SQLSRV_SQLTYPE_NUMERIC(10,5)", "SQLSRV_SQLTYPE_FLOAT", "SQLSRV_SQLTYPE_REAL", "SQLSRV_SQLTYPE_BIGINT", "SQLSRV_SQLTYPE_INT", "SQLSRV_SQLTYPE_SMALLINT", "SQLSRV_SQLTYPE_TINYINT", "SQLSRV_SQLTYPE_MONEY", "SQLSRV_SQLTYPE_SMALLMONEY", "SQLSRV_SQLTYPE_BIT", "SQLSRV_SQLTYPE_TIMESTAMP" ), @@ -51,6 +53,7 @@ foreach ( $dataTypes as $dataType ) { if ( stripos( $compatType, $sqlType ) !== false ) $isCompat = true; } + // 22018 is the SQLSTATE for any incompatible conversion errors if ( $isCompat && sqlsrv_errors()[0]['SQLSTATE'] == 22018 ) { echo "$sqlType should be compatible with $dataType\n"; @@ -62,6 +65,7 @@ foreach ( $dataTypes as $dataType ) { { if ( $r === false ) { + // always encrypted only allow sqlType that is identical to the encrypted column datatype if ( stripos( "SQLSRV_SQLTYPE_" . $dataType, $sqlType ) !== false ) { echo "$sqlType should be compatible with $dataType\n"; diff --git a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_string.phpt b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_string.phpt index a77dd099..0118d91b 100644 --- a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_string.phpt +++ b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_string.phpt @@ -9,6 +9,8 @@ include 'MsCommon.inc'; include 'AEData.inc'; $dataTypes = array( "char(5)", "varchar(max)", "nchar(5)", "nvarchar(max)" ); + +// this is a list of implicit datatype conversion that SQL Server allows (https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-type-conversion-database-engine) $compatList = array( "char(5)" => array( "SQLSRV_SQLTYPE_CHAR(5)", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR(5)", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DECIMAL", "SQLSRV_SQLTYPE_NUMERIC", "SQLSRV_SQLTYPE_NTEXT", "SQLSRV_SQLTYPE_TEXT", "SQLSRV_SQLTYPE_XML" ), "varchar(max)" => array( "SQLSRV_SQLTYPE_CHAR(5)", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR(5)", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DECIMAL", "SQLSRV_SQLTYPE_NUMERIC", "SQLSRV_SQLTYPE_NTEXT", "SQLSRV_SQLTYPE_TEXT", "SQLSRV_SQLTYPE_XML" ), "nchar(5)" => array( "SQLSRV_SQLTYPE_CHAR(5)", "SQLSRV_SQLTYPE_VARCHAR", "SQLSRV_SQLTYPE_NCHAR(5)", "SQLSRV_SQLTYPE_NVARCHAR", "SQLSRV_SQLTYPE_DECIMAL", "SQLSRV_SQLTYPE_NUMERIC", "SQLSRV_SQLTYPE_NTEXT", "SQLSRV_SQLTYPE_TEXT", "SQLSRV_SQLTYPE_XML" ), @@ -45,6 +47,7 @@ foreach ( $dataTypes as $dataType ) { if ( stripos( $compatType, $sqlType ) !== false ) $isCompat = true; } + // 22018 is the SQLSTATE for any incompatible conversion errors if ( $isCompat && sqlsrv_errors()[0]['SQLSTATE'] == 22018 ) { echo "$sqlType should be compatible with $dataType\n"; @@ -53,6 +56,7 @@ foreach ( $dataTypes as $dataType ) { } else { + // always encrypted only allow sqlType that is identical to the encrypted column datatype if ( stripos( "SQLSRV_SQLTYPE_" . $dataType, $sqlType ) !== false ) { echo "$sqlType should be compatible with $dataType\n"; From 0d5bd2490b558504c49236437c79a8459b80e14a Mon Sep 17 00:00:00 2001 From: v-kaywon Date: Mon, 25 Sep 2017 12:29:15 -0700 Subject: [PATCH 4/6] change variable name isCompat to isCompatible --- .../sqlsrv/sqlsrv_ae_insert_sqltype_datetime.phpt | 6 +++--- test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_money.phpt | 6 +++--- .../functional/sqlsrv/sqlsrv_ae_insert_sqltype_numeric.phpt | 6 +++--- test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_string.phpt | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_datetime.phpt b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_datetime.phpt index e1b56821..aed767b6 100644 --- a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_datetime.phpt +++ b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_datetime.phpt @@ -44,14 +44,14 @@ foreach ( $dataTypes as $dataType ) { { if ( $r === false ) { - $isCompat = false; + $isCompatible = false; foreach ( $compatList[$dataType] as $compatType ) { if ( $compatType == $sqlType ) - $isCompat = true; + $isCompatible = true; } // 22018 is the SQLSTATE for any incompatible conversion errors - if ( $isCompat && sqlsrv_errors()[0]['SQLSTATE'] == 22018 ) + if ( $isCompatible && sqlsrv_errors()[0]['SQLSTATE'] == 22018 ) { echo "$sqlType should be compatible with $dataType\n"; $success = false; diff --git a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_money.phpt b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_money.phpt index cf4d0f2a..1c729c00 100644 --- a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_money.phpt +++ b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_money.phpt @@ -39,14 +39,14 @@ foreach ( $dataTypes as $dataType ) { { if ( $r === false ) { - $isCompat = false; + $isCompatible = false; foreach ( $compatList[$dataType] as $compatType ) { if ( stripos( $compatType, $sqlType ) !== false ) - $isCompat = true; + $isCompatible = true; } // 22018 is the SQLSTATE for any incompatible conversion errors - if ( $isCompat && sqlsrv_errors()[0]['SQLSTATE'] == 22018 ) + if ( $isCompatible && sqlsrv_errors()[0]['SQLSTATE'] == 22018 ) { echo "$sqlType should be compatible with $dataType\n"; $success = false; diff --git a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_numeric.phpt b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_numeric.phpt index 5218181b..491f9586 100644 --- a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_numeric.phpt +++ b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_numeric.phpt @@ -47,14 +47,14 @@ foreach ( $dataTypes as $dataType ) { { if ( $r === false ) { - $isCompat = false; + $isCompatibleible = false; foreach ( $compatList[$dataType] as $compatType ) { if ( stripos( $compatType, $sqlType ) !== false ) - $isCompat = true; + $isCompatibleible = true; } // 22018 is the SQLSTATE for any incompatible conversion errors - if ( $isCompat && sqlsrv_errors()[0]['SQLSTATE'] == 22018 ) + if ( $isCompatibleible && sqlsrv_errors()[0]['SQLSTATE'] == 22018 ) { echo "$sqlType should be compatible with $dataType\n"; $success = false; diff --git a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_string.phpt b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_string.phpt index 0118d91b..a8ab7e21 100644 --- a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_string.phpt +++ b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_string.phpt @@ -41,14 +41,14 @@ foreach ( $dataTypes as $dataType ) { { if ( !is_col_enc() ) { - $isCompat = false; + $isCompatible = false; foreach ( $compatList[$dataType] as $compatType ) { if ( stripos( $compatType, $sqlType ) !== false ) - $isCompat = true; + $isCompatible = true; } // 22018 is the SQLSTATE for any incompatible conversion errors - if ( $isCompat && sqlsrv_errors()[0]['SQLSTATE'] == 22018 ) + if ( $isCompatible && sqlsrv_errors()[0]['SQLSTATE'] == 22018 ) { echo "$sqlType should be compatible with $dataType\n"; $success = false; From 6d3ea18fedbdf63f258afc15e8b6d8ea17efc535 Mon Sep 17 00:00:00 2001 From: v-susanh Date: Mon, 25 Sep 2017 16:37:27 -0700 Subject: [PATCH 5/6] moved test descriptions to DESCRIPTION section (#554) --- test/functional/pdo_sqlsrv/pdo_ae_insert_datetime.phpt | 3 ++- test/functional/pdo_sqlsrv/pdo_ae_insert_money.phpt | 3 ++- test/functional/pdo_sqlsrv/pdo_ae_insert_numeric.phpt | 3 ++- .../functional/pdo_sqlsrv/pdo_ae_insert_pdoparam_datetime.phpt | 3 ++- test/functional/pdo_sqlsrv/pdo_ae_insert_pdoparam_money.phpt | 3 ++- test/functional/pdo_sqlsrv/pdo_ae_insert_pdoparam_numeric.phpt | 3 ++- test/functional/pdo_sqlsrv/pdo_ae_insert_pdoparam_string.phpt | 3 ++- test/functional/pdo_sqlsrv/pdo_ae_insert_retrieve.phpt | 3 ++- test/functional/pdo_sqlsrv/pdo_ae_insert_string.phpt | 3 ++- test/functional/sqlsrv/sqlsrv_ae_insert_datetime.phpt | 3 ++- test/functional/sqlsrv/sqlsrv_ae_insert_money.phpt | 3 ++- test/functional/sqlsrv/sqlsrv_ae_insert_numeric.phpt | 3 ++- test/functional/sqlsrv/sqlsrv_ae_insert_retrieve.phpt | 3 ++- test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_datetime.phpt | 3 ++- test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_money.phpt | 3 ++- test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_numeric.phpt | 3 ++- test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_string.phpt | 3 ++- test/functional/sqlsrv/sqlsrv_ae_insert_string.phpt | 3 ++- 18 files changed, 36 insertions(+), 18 deletions(-) diff --git a/test/functional/pdo_sqlsrv/pdo_ae_insert_datetime.phpt b/test/functional/pdo_sqlsrv/pdo_ae_insert_datetime.phpt index 0ba80345..f81cf8a8 100644 --- a/test/functional/pdo_sqlsrv/pdo_ae_insert_datetime.phpt +++ b/test/functional/pdo_sqlsrv/pdo_ae_insert_datetime.phpt @@ -1,5 +1,6 @@ --TEST-- Test for inserting and retrieving encrypted data of datetime types +--DESCRIPTION-- No PDO::PARAM_ type specified when binding parameters --SKIPIF-- @@ -73,4 +74,4 @@ c_rand: 23:59:59.9999999 Testing datetimeoffset: ****Encrypted default type is compatible with encrypted datetimeoffset**** c_det: 0001-01-01 00:00:00.0000000 -14:00 -c_rand: 9999-12-31 23:59:59.9999999 +14:00 \ No newline at end of file +c_rand: 9999-12-31 23:59:59.9999999 +14:00 diff --git a/test/functional/pdo_sqlsrv/pdo_ae_insert_money.phpt b/test/functional/pdo_sqlsrv/pdo_ae_insert_money.phpt index 8422df98..e778290c 100644 --- a/test/functional/pdo_sqlsrv/pdo_ae_insert_money.phpt +++ b/test/functional/pdo_sqlsrv/pdo_ae_insert_money.phpt @@ -1,5 +1,6 @@ --TEST-- Test for inserting and retrieving encrypted data of money types +--DESCRIPTION-- No PDO::PARAM_ tpe specified when binding parameters --SKIPIF-- @@ -82,4 +83,4 @@ Testing smallmoney: Test successfully done. Testing money: -Test successfully done. \ No newline at end of file +Test successfully done. diff --git a/test/functional/pdo_sqlsrv/pdo_ae_insert_numeric.phpt b/test/functional/pdo_sqlsrv/pdo_ae_insert_numeric.phpt index 7690a4d1..753d59b0 100644 --- a/test/functional/pdo_sqlsrv/pdo_ae_insert_numeric.phpt +++ b/test/functional/pdo_sqlsrv/pdo_ae_insert_numeric.phpt @@ -1,5 +1,6 @@ --TEST-- Test for inserting and retrieving encrypted data of numeric types +--DESCRIPTION-- No PDO::PARAM_ tpe specified when binding parameters --SKIPIF-- @@ -88,4 +89,4 @@ c_rand: 9223372036.8547993 Testing real: ****Encrypted default type is compatible with encrypted real**** c_det: -2147.4829 -c_rand: 2147.4829 \ No newline at end of file +c_rand: 2147.4829 diff --git a/test/functional/pdo_sqlsrv/pdo_ae_insert_pdoparam_datetime.phpt b/test/functional/pdo_sqlsrv/pdo_ae_insert_pdoparam_datetime.phpt index 4c6be469..c6b3523c 100644 --- a/test/functional/pdo_sqlsrv/pdo_ae_insert_pdoparam_datetime.phpt +++ b/test/functional/pdo_sqlsrv/pdo_ae_insert_pdoparam_datetime.phpt @@ -1,5 +1,6 @@ --TEST-- Test for inserting and retrieving encrypted data of datetime types +--DESCRIPTION-- Use PDOstatement::bindParam with all PDO::PARAM_ types --SKIPIF-- @@ -150,4 +151,4 @@ c_det: 0001-01-01 00:00:00.0000000 -14:00 c_rand: 9999-12-31 23:59:59.9999999 +14:00 ****PDO param type PDO::PARAM_LOB is compatible with encrypted datetimeoffset**** c_det: 0001-01-01 00:00:00.0000000 -14:00 -c_rand: 9999-12-31 23:59:59.9999999 +14:00 \ No newline at end of file +c_rand: 9999-12-31 23:59:59.9999999 +14:00 diff --git a/test/functional/pdo_sqlsrv/pdo_ae_insert_pdoparam_money.phpt b/test/functional/pdo_sqlsrv/pdo_ae_insert_pdoparam_money.phpt index 224b5da7..9a8b2412 100644 --- a/test/functional/pdo_sqlsrv/pdo_ae_insert_pdoparam_money.phpt +++ b/test/functional/pdo_sqlsrv/pdo_ae_insert_pdoparam_money.phpt @@ -1,5 +1,6 @@ --TEST-- Test for inserting and retrieving encrypted data of money types +--DESCRIPTION-- Use PDOstatement::bindParam with all PDO::PARAM_ types --SKIPIF-- @@ -89,4 +90,4 @@ Testing smallmoney: Test successfully done. Testing money: -Test successfully done. \ No newline at end of file +Test successfully done. diff --git a/test/functional/pdo_sqlsrv/pdo_ae_insert_pdoparam_numeric.phpt b/test/functional/pdo_sqlsrv/pdo_ae_insert_pdoparam_numeric.phpt index af396ca9..c40e2aeb 100644 --- a/test/functional/pdo_sqlsrv/pdo_ae_insert_pdoparam_numeric.phpt +++ b/test/functional/pdo_sqlsrv/pdo_ae_insert_pdoparam_numeric.phpt @@ -1,5 +1,6 @@ --TEST-- Test for inserting and retrieving encrypted data of numeric types +--DESCRIPTION-- Use PDOstatement::bindParam with all PDO::PARAM_ types --SKIPIF-- @@ -184,4 +185,4 @@ c_det: -2147.4829 c_rand: 2147.4829 ****PDO param type PDO::PARAM_LOB is compatible with encrypted real**** c_det: -2147.4829 -c_rand: 2147.4829 \ No newline at end of file +c_rand: 2147.4829 diff --git a/test/functional/pdo_sqlsrv/pdo_ae_insert_pdoparam_string.phpt b/test/functional/pdo_sqlsrv/pdo_ae_insert_pdoparam_string.phpt index e9bd7192..4b2b9c59 100644 --- a/test/functional/pdo_sqlsrv/pdo_ae_insert_pdoparam_string.phpt +++ b/test/functional/pdo_sqlsrv/pdo_ae_insert_pdoparam_string.phpt @@ -1,5 +1,6 @@ --TEST-- Test for inserting and retrieving encrypted data of string types +--DESCRIPTION-- Use PDOstatement::bindParam with all PDO::PARAM_ types --SKIPIF-- @@ -117,4 +118,4 @@ c_det: When prefixing a string constant with the letter N, the implicit conversi c_rand: Otherwise, the implicit conversion will result in a Unicode large-value (max). ****PDO param type PDO::PARAM_LOB is compatible with encrypted nvarchar(max)**** c_det: When prefixing a string constant with the letter N, the implicit conversion will result in a Unicode string if the constant to convert does not exceed the max length for a Unicode string data type (4,000). -c_rand: Otherwise, the implicit conversion will result in a Unicode large-value (max). \ No newline at end of file +c_rand: Otherwise, the implicit conversion will result in a Unicode large-value (max). diff --git a/test/functional/pdo_sqlsrv/pdo_ae_insert_retrieve.phpt b/test/functional/pdo_sqlsrv/pdo_ae_insert_retrieve.phpt index 956b3312..7bba2212 100644 --- a/test/functional/pdo_sqlsrv/pdo_ae_insert_retrieve.phpt +++ b/test/functional/pdo_sqlsrv/pdo_ae_insert_retrieve.phpt @@ -1,5 +1,6 @@ --TEST-- Test for inserting encrypted data and retrieving both encrypted and decrypted data +--DESCRIPTION-- Retrieving SQL query contains encrypted filter --SKIPIF-- @@ -79,4 +80,4 @@ LastName: Abel BirthDate: 1996-10-19 Checking ciphertext data: -Done \ No newline at end of file +Done diff --git a/test/functional/pdo_sqlsrv/pdo_ae_insert_string.phpt b/test/functional/pdo_sqlsrv/pdo_ae_insert_string.phpt index d813d584..4ef6b026 100644 --- a/test/functional/pdo_sqlsrv/pdo_ae_insert_string.phpt +++ b/test/functional/pdo_sqlsrv/pdo_ae_insert_string.phpt @@ -1,5 +1,6 @@ --TEST-- Test for inserting and retrieving encrypted data of string types +--DESCRIPTION-- No PDO::PARAM_ type specified when binding parameters --SKIPIF-- @@ -63,4 +64,4 @@ c_rand: th Un Testing nvarchar(max): ****Encrypted default type is compatible with encrypted nvarchar(max)**** c_det: When prefixing a string constant with the letter N, the implicit conversion will result in a Unicode string if the constant to convert does not exceed the max length for a Unicode string data type (4,000). -c_rand: Otherwise, the implicit conversion will result in a Unicode large-value (max). \ No newline at end of file +c_rand: Otherwise, the implicit conversion will result in a Unicode large-value (max). diff --git a/test/functional/sqlsrv/sqlsrv_ae_insert_datetime.phpt b/test/functional/sqlsrv/sqlsrv_ae_insert_datetime.phpt index bba08a58..5ad69ca6 100644 --- a/test/functional/sqlsrv/sqlsrv_ae_insert_datetime.phpt +++ b/test/functional/sqlsrv/sqlsrv_ae_insert_datetime.phpt @@ -1,5 +1,6 @@ --TEST-- Test for inserting and retrieving encrypted data of datetime types +--DESCRIPTION-- Bind params using sqlsrv_prepare without any sql_type specified --SKIPIF-- @@ -109,4 +110,4 @@ c_det: c_rand: date: 9999-12-31 23:59:59.1000000 timezone_type: 1 - timezone: +14:00 \ No newline at end of file + timezone: +14:00 diff --git a/test/functional/sqlsrv/sqlsrv_ae_insert_money.phpt b/test/functional/sqlsrv/sqlsrv_ae_insert_money.phpt index dcce360a..0f896635 100644 --- a/test/functional/sqlsrv/sqlsrv_ae_insert_money.phpt +++ b/test/functional/sqlsrv/sqlsrv_ae_insert_money.phpt @@ -1,5 +1,6 @@ --TEST-- Test for inserting and retrieving encrypted data of money types +--DESCRIPTION-- Bind params using sqlsrv_prepare without any sql_type specified --SKIPIF-- @@ -73,4 +74,4 @@ Testing smallmoney: Test successfully done. Testing money: -Test successfully done. \ No newline at end of file +Test successfully done. diff --git a/test/functional/sqlsrv/sqlsrv_ae_insert_numeric.phpt b/test/functional/sqlsrv/sqlsrv_ae_insert_numeric.phpt index 8b215abc..07c7b71c 100644 --- a/test/functional/sqlsrv/sqlsrv_ae_insert_numeric.phpt +++ b/test/functional/sqlsrv/sqlsrv_ae_insert_numeric.phpt @@ -1,5 +1,6 @@ --TEST-- Test for inserting and retrieving encrypted data of numeric types +--DESCRIPTION-- Bind params using sqlsrv_prepare without any sql_type specified --SKIPIF-- @@ -80,4 +81,4 @@ c_rand: 9223372036.8548 Testing real: ****Encrypted default type is compatible with encrypted real**** c_det: -2147.4829101562 -c_rand: 2147.4829101562 \ No newline at end of file +c_rand: 2147.4829101562 diff --git a/test/functional/sqlsrv/sqlsrv_ae_insert_retrieve.phpt b/test/functional/sqlsrv/sqlsrv_ae_insert_retrieve.phpt index 1b51a968..77411787 100644 --- a/test/functional/sqlsrv/sqlsrv_ae_insert_retrieve.phpt +++ b/test/functional/sqlsrv/sqlsrv_ae_insert_retrieve.phpt @@ -1,5 +1,6 @@ --TEST-- Test for inserting encrypted data and retrieving both encrypted and decrypted data +--DESCRIPTION-- Retrieving SQL query contains encrypted filter --SKIPIF-- @@ -79,4 +80,4 @@ BirthDate: timezone: Canada/Pacific Checking ciphertext data: -Done \ No newline at end of file +Done diff --git a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_datetime.phpt b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_datetime.phpt index aed767b6..ec17ca5e 100644 --- a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_datetime.phpt +++ b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_datetime.phpt @@ -1,5 +1,6 @@ --TEST-- Test for inserting and retrieving encrypted data of datetime types +--DESCRIPTION-- Bind params using sqlsrv_prepare with all sql_type --SKIPIF-- @@ -111,4 +112,4 @@ Testing time: Test successfully done. Testing datetimeoffset: -Test successfully done. \ No newline at end of file +Test successfully done. diff --git a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_money.phpt b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_money.phpt index 1c729c00..1654f199 100644 --- a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_money.phpt +++ b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_money.phpt @@ -1,5 +1,6 @@ --TEST-- Test for inserting and retrieving encrypted data of money types +--DESCRIPTION-- Bind params using sqlsrv_prepare with all sql_type --SKIPIF-- @@ -76,4 +77,4 @@ Testing smallmoney: Test successfully done. Testing money: -Test successfully done. \ No newline at end of file +Test successfully done. diff --git a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_numeric.phpt b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_numeric.phpt index 491f9586..81105e05 100644 --- a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_numeric.phpt +++ b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_numeric.phpt @@ -1,5 +1,6 @@ --TEST-- Test for inserting and retrieving encrypted data of numeric types +--DESCRIPTION-- Bind params using sqlsrv_prepare with all sql_type --SKIPIF-- @@ -132,4 +133,4 @@ Testing float: Test successfully done. Testing real: -Test successfully done. \ No newline at end of file +Test successfully done. diff --git a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_string.phpt b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_string.phpt index a8ab7e21..a5f7fb5e 100644 --- a/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_string.phpt +++ b/test/functional/sqlsrv/sqlsrv_ae_insert_sqltype_string.phpt @@ -1,5 +1,6 @@ --TEST-- Test for inserting and retrieving encrypted data of string types +--DESCRIPTION-- Bind params using sqlsrv_prepare with all sql_type --SKIPIF-- @@ -97,4 +98,4 @@ Testing nchar(5): Test successfully done. Testing nvarchar(max): -Test successfully done. \ No newline at end of file +Test successfully done. diff --git a/test/functional/sqlsrv/sqlsrv_ae_insert_string.phpt b/test/functional/sqlsrv/sqlsrv_ae_insert_string.phpt index c059b571..98700074 100644 --- a/test/functional/sqlsrv/sqlsrv_ae_insert_string.phpt +++ b/test/functional/sqlsrv/sqlsrv_ae_insert_string.phpt @@ -1,5 +1,6 @@ --TEST-- Test for inserting and retrieving encrypted data of string types +--DESCRIPTION-- Bind params using sqlsrv_prepare without any sql_type specified --SKIPIF-- @@ -55,4 +56,4 @@ c_rand: th Un Testing nvarchar(max): ****Encrypted default type is compatible with encrypted nvarchar(max)**** c_det: When prefixing a string constant with the letter N, the implicit conversion will result in a Unicode string if the constant to convert does not exceed the max length for a Unicode string data type (4,000). -c_rand: Otherwise, the implicit conversion will result in a Unicode large-value (max). \ No newline at end of file +c_rand: Otherwise, the implicit conversion will result in a Unicode large-value (max). From ca9ba63672f41ab87a2a6adc3191880e449c21e1 Mon Sep 17 00:00:00 2001 From: David Puglielli Date: Tue, 26 Sep 2017 11:17:35 -0700 Subject: [PATCH 6/6] Update README.md --- ODBC 17 binaries preview/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ODBC 17 binaries preview/README.md b/ODBC 17 binaries preview/README.md index e019ff8c..6b79f14d 100644 --- a/ODBC 17 binaries preview/README.md +++ b/ODBC 17 binaries preview/README.md @@ -1 +1,3 @@ -The ODBC driver 17 preview binaries in this directory are required in order to use Always Encrypted (AE) functionality. Please note that these drivers should be considered to be preview versions -- they should not be used in production and are not supported by Microsoft. They will be replaced upon the official release of ODBC driver 17. \ No newline at end of file +The ODBC driver 17 preview binaries in this directory are required in order to use Always Encrypted (AE) functionality. Please note that these drivers should be considered to be preview versions -- they should not be used in production and are not supported by Microsoft. They will be replaced upon the official release of ODBC driver 17. + +To install on Windows, simply run the msi. For instructions on installing the binaries on Linux platforms, please see [this page](https://github.com/Microsoft/msphpsql/wiki/Install-and-configuration#odbc-17-linux-installation).