Mercurial > hg > MonetDB
changeset 86142:11ce4397edec
Correcting datatypes for result columns BUFFER_LENGTH and DECIMAL_DIGITS as returned by SQLColumns(), SQLSpecialColumns() and SQLProcedureColumns(). They must be INTEGER and SMALLINT instead of BIGINT and BIGINT.
| author | Martin van Dinther <martin.van.dinther@monetdbsolutions.com> |
|---|---|
| date | Thu, 21 Jul 2022 19:21:24 +0200 |
| parents | 429ad7e2d502 |
| children | 051a7803c8b3 |
| files | clients/odbc/driver/ODBCQueries.h clients/odbc/driver/SQLSpecialColumns.c clients/odbc/tests/ODBCmetadata.c |
| diffstat | 3 files changed, 28 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/clients/odbc/driver/ODBCQueries.h +++ b/clients/odbc/driver/ODBCQueries.h @@ -136,7 +136,7 @@ "else " #t ".type_digits " \ "end as \"COLUMN_SIZE\"" -#define BUFFER_LENGTH(t) "case " #t ".type " \ +#define BUFFER_LENGTH(t) "cast(case " #t ".type " \ "when 'bigint' then 20 " \ "when 'char' then 2 * " #t ".type_digits " \ "when 'clob' then 2 * " #t ".type_digits " \ @@ -173,9 +173,9 @@ "when 'tinyint' then 4 " \ "when 'varchar' then 2 * " #t ".type_digits " \ "else " #t ".type_digits " \ - "end as \"BUFFER_LENGTH\"" + "end as integer) as \"BUFFER_LENGTH\"" -#define DECIMAL_DIGITS(t) "case " #t ".type " \ +#define DECIMAL_DIGITS(t) "cast(case " #t ".type " \ "when 'bigint' then 0 " \ "when 'day_interval' then 0 " \ "when 'decimal' then " #t ".type_scale " \ @@ -198,7 +198,7 @@ "when 'timetz' then " #t ".type_digits - 1 " \ "when 'tinyint' then 0 " \ "else cast(null as smallint) " \ - "end as \"DECIMAL_DIGITS\"" + "end as smallint) as \"DECIMAL_DIGITS\"" #define NUM_PREC_RADIX(t) "case " #t ".type " \ "when 'bigint' then 2 " \
--- a/clients/odbc/driver/SQLSpecialColumns.c +++ b/clients/odbc/driver/SQLSpecialColumns.c @@ -424,7 +424,7 @@ MNDBSpecialColumns(ODBCStmt *stmt, assert(IdentifierType == SQL_ROWVER); /* The backend does not have such info available */ /* create just a query which results in zero rows */ - /* Note: pseudo_column is sql_pc_unknown is 0 */ + /* Note: PSEUDO_COLUMN is SQL_PC_UNKNOWN is 0 */ query = strdup("select cast(null as smallint) as \"SCOPE\", " "cast('' as varchar(1)) as \"COLUMN_NAME\", " "cast(1 as smallint) as \"DATA_TYPE\", "
--- a/clients/odbc/tests/ODBCmetadata.c +++ b/clients/odbc/tests/ODBCmetadata.c @@ -492,7 +492,7 @@ main(int argc, char **argv) "Resultset with 18 columns\n" "Resultset with 7 rows\n" "TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE\n" - "WVARCHAR(1) WVARCHAR(1024) WVARCHAR(1024) WVARCHAR(1024) SMALLINT WCHAR(25) INTEGER BIGINT BIGINT SMALLINT SMALLINT WVARCHAR(65000) WVARCHAR(2048) SMALLINT SMALLINT BIGINT INTEGER WVARCHAR(3)\n" + "WVARCHAR(1) WVARCHAR(1024) WVARCHAR(1024) WVARCHAR(1024) SMALLINT WCHAR(25) INTEGER INTEGER SMALLINT SMALLINT SMALLINT WVARCHAR(65000) WVARCHAR(2048) SMALLINT SMALLINT BIGINT INTEGER WVARCHAR(3)\n" "NULL odbctst nopk_twoucs id2 4 INTEGER 32 11 0 2 0 odbctst.nopk_twoucs.id2 column comment NULL 4 NULL NULL 1 NO\n" "NULL odbctst nopk_twoucs name2 -9 VARCHAR 99 198 NULL NULL 1 odbctst.nopk_twoucs.name2 column comment NULL -9 NULL 198 2 YES\n" "NULL odbctst pk2c pkc1 4 INTEGER 32 11 0 2 0 NULL NULL 4 NULL NULL 1 NO\n" @@ -509,7 +509,7 @@ main(int argc, char **argv) "Resultset with 18 columns\n" "Resultset with 8 rows\n" "TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE\n" - "WVARCHAR(1) WVARCHAR(1024) WVARCHAR(1024) WVARCHAR(1024) SMALLINT WCHAR(25) INTEGER BIGINT BIGINT SMALLINT SMALLINT WVARCHAR(65000) WVARCHAR(2048) SMALLINT SMALLINT BIGINT INTEGER WVARCHAR(3)\n" + "WVARCHAR(1) WVARCHAR(1024) WVARCHAR(1024) WVARCHAR(1024) SMALLINT WCHAR(25) INTEGER INTEGER SMALLINT SMALLINT SMALLINT WVARCHAR(65000) WVARCHAR(2048) SMALLINT SMALLINT BIGINT INTEGER WVARCHAR(3)\n" "NULL tmp glbl_nopk_twoucs id2 4 INTEGER 32 11 0 2 0 NULL NULL 4 NULL NULL 1 NO\n" "NULL tmp glbl_nopk_twoucs name2 -9 VARCHAR 99 198 NULL NULL 1 NULL NULL -9 NULL 198 2 YES\n" "NULL tmp glbl_pk_uc id1 4 INTEGER 32 11 0 2 0 NULL NULL 4 NULL NULL 1 NO\n" @@ -527,12 +527,21 @@ main(int argc, char **argv) "Resultset with 18 columns\n" "Resultset with 4 rows\n" "TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE\n" - "WVARCHAR(1) WVARCHAR(1024) WVARCHAR(1024) WVARCHAR(1024) SMALLINT WCHAR(25) INTEGER BIGINT BIGINT SMALLINT SMALLINT WVARCHAR(65000) WVARCHAR(2048) SMALLINT SMALLINT BIGINT INTEGER WVARCHAR(3)\n" + "WVARCHAR(1) WVARCHAR(1024) WVARCHAR(1024) WVARCHAR(1024) SMALLINT WCHAR(25) INTEGER INTEGER SMALLINT SMALLINT SMALLINT WVARCHAR(65000) WVARCHAR(2048) SMALLINT SMALLINT BIGINT INTEGER WVARCHAR(3)\n" "NULL tmp glbl_nopk_twoucs name2 -9 VARCHAR 99 198 NULL NULL 1 NULL NULL -9 NULL 198 2 YES\n" "NULL tmp glbl_pk_uc name1 -9 VARCHAR 99 198 NULL NULL 1 NULL NULL -9 NULL 198 2 YES\n" "NULL tmp tmp_nopk_twoucs name2 -9 VARCHAR 99 198 NULL NULL 1 NULL NULL -9 NULL 198 2 YES\n" "NULL tmp tmp_pk_uc name1 -9 VARCHAR 99 198 NULL NULL 1 NULL NULL -9 NULL 198 2 YES\n"); + ret = SQLSpecialColumns(stmt, SQL_ROWVER, (SQLCHAR*)NULL, 0, + (SQLCHAR*)"%", SQL_NTS, (SQLCHAR*)"%", SQL_NTS, + SQL_SCOPE_SESSION, SQL_NO_NULLS); + compareResult(stmt, ret, "SQLSpecialColumns (%, %, SQL_ROWVER)", + "Resultset with 8 columns\n" + "Resultset with 0 rows\n" + "SCOPE COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS PSEUDO_COLUMN\n" + "SMALLINT WVARCHAR(1) SMALLINT WVARCHAR(4) INTEGER INTEGER SMALLINT SMALLINT\n"); + // sys.table_types ret = SQLPrimaryKeys(stmt, (SQLCHAR*)"", SQL_NTS, (SQLCHAR*)"sys", SQL_NTS, (SQLCHAR*)"table_types", SQL_NTS); @@ -550,7 +559,7 @@ main(int argc, char **argv) "Resultset with 8 columns\n" "Resultset with 1 rows\n" "SCOPE COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS PSEUDO_COLUMN\n" - "SMALLINT WVARCHAR(1024) SMALLINT WCHAR(25) INTEGER BIGINT BIGINT SMALLINT\n" + "SMALLINT WVARCHAR(1024) SMALLINT WCHAR(25) INTEGER INTEGER SMALLINT SMALLINT\n" "1 table_type_id 5 SMALLINT 16 6 0 1\n"); ret = SQLStatistics(stmt, (SQLCHAR*)"", SQL_NTS, @@ -609,7 +618,7 @@ main(int argc, char **argv) "Resultset with 8 columns\n" "Resultset with 1 rows\n" "SCOPE COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS PSEUDO_COLUMN\n" - "SMALLINT WVARCHAR(1024) SMALLINT WCHAR(25) INTEGER BIGINT BIGINT SMALLINT\n" + "SMALLINT WVARCHAR(1024) SMALLINT WCHAR(25) INTEGER INTEGER SMALLINT SMALLINT\n" "1 id1 4 INTEGER 32 11 0 1\n"); ret = SQLSpecialColumns(stmt, SQL_ROWVER, (SQLCHAR*)"", SQL_NTS, @@ -683,7 +692,7 @@ main(int argc, char **argv) "Resultset with 8 columns\n" "Resultset with 1 rows\n" "SCOPE COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS PSEUDO_COLUMN\n" - "SMALLINT WVARCHAR(1024) SMALLINT WCHAR(25) INTEGER BIGINT BIGINT SMALLINT\n" + "SMALLINT WVARCHAR(1024) SMALLINT WCHAR(25) INTEGER INTEGER SMALLINT SMALLINT\n" "1 id1 4 INTEGER 32 11 0 1\n"); ret = SQLStatistics(stmt, (SQLCHAR*)"", SQL_NTS, @@ -749,7 +758,7 @@ main(int argc, char **argv) "Resultset with 8 columns\n" "Resultset with 1 rows\n" "SCOPE COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS PSEUDO_COLUMN\n" - "SMALLINT WVARCHAR(1024) SMALLINT WCHAR(25) INTEGER BIGINT BIGINT SMALLINT\n" + "SMALLINT WVARCHAR(1024) SMALLINT WCHAR(25) INTEGER INTEGER SMALLINT SMALLINT\n" "1 id1 4 INTEGER 32 11 0 1\n"); ret = SQLStatistics(stmt, (SQLCHAR*)"", SQL_NTS, @@ -814,7 +823,7 @@ main(int argc, char **argv) "Resultset with 8 columns\n" "Resultset with 1 rows\n" "SCOPE COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS PSEUDO_COLUMN\n" - "SMALLINT WVARCHAR(1024) SMALLINT WCHAR(25) INTEGER BIGINT BIGINT SMALLINT\n" + "SMALLINT WVARCHAR(1024) SMALLINT WCHAR(25) INTEGER INTEGER SMALLINT SMALLINT\n" "1 id2 4 INTEGER 32 11 0 1\n"); ret = SQLStatistics(stmt, (SQLCHAR*)"", SQL_NTS, @@ -877,7 +886,7 @@ main(int argc, char **argv) "Resultset with 8 columns\n" "Resultset with 1 rows\n" "SCOPE COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS PSEUDO_COLUMN\n" - "SMALLINT WVARCHAR(1024) SMALLINT WCHAR(25) INTEGER BIGINT BIGINT SMALLINT\n" + "SMALLINT WVARCHAR(1024) SMALLINT WCHAR(25) INTEGER INTEGER SMALLINT SMALLINT\n" "1 id2 4 INTEGER 32 11 0 1\n"); ret = SQLStatistics(stmt, (SQLCHAR*)"", SQL_NTS, @@ -942,7 +951,7 @@ main(int argc, char **argv) "Resultset with 8 columns\n" "Resultset with 1 rows\n" "SCOPE COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS PSEUDO_COLUMN\n" - "SMALLINT WVARCHAR(1024) SMALLINT WCHAR(25) INTEGER BIGINT BIGINT SMALLINT\n" + "SMALLINT WVARCHAR(1024) SMALLINT WCHAR(25) INTEGER INTEGER SMALLINT SMALLINT\n" "1 id2 4 INTEGER 32 11 0 1\n"); ret = SQLStatistics(stmt, (SQLCHAR*)"", SQL_NTS, @@ -1107,7 +1116,7 @@ main(int argc, char **argv) "Resultset with 20 columns\n" "Resultset with 6 rows\n" "PROCEDURE_CAT PROCEDURE_SCHEM PROCEDURE_NAME COLUMN_NAME COLUMN_TYPE DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE SPECIFIC_NAME\n" - "WVARCHAR(1) WVARCHAR(1024) WVARCHAR(256) WVARCHAR(256) TINYINT SMALLINT WCHAR(25) INTEGER BIGINT BIGINT SMALLINT SMALLINT WVARCHAR(65000) WVARCHAR(1) SMALLINT SMALLINT BIGINT BIGINT WCHAR WVARCHAR(10)\n" + "WVARCHAR(1) WVARCHAR(1024) WVARCHAR(256) WVARCHAR(256) TINYINT SMALLINT WCHAR(25) INTEGER INTEGER SMALLINT SMALLINT SMALLINT WVARCHAR(65000) WVARCHAR(1) SMALLINT SMALLINT BIGINT BIGINT WCHAR WVARCHAR(10)\n" "NULL sys analyze sname 1 -9 VARCHAR 1024 2048 NULL NULL 2 NULL NULL -9 NULL 2048 1 replacedId\n" "NULL sys analyze sname 1 -9 VARCHAR 1024 2048 NULL NULL 2 NULL NULL -9 NULL 2048 1 replacedId\n" "NULL sys analyze tname 1 -9 VARCHAR 1024 2048 NULL NULL 2 NULL NULL -9 NULL 2048 2 replacedId\n" @@ -1133,7 +1142,7 @@ main(int argc, char **argv) "Resultset with 20 columns\n" "Resultset with 4 rows\n" "PROCEDURE_CAT PROCEDURE_SCHEM PROCEDURE_NAME COLUMN_NAME COLUMN_TYPE DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE SPECIFIC_NAME\n" - "WVARCHAR(1) WVARCHAR(1024) WVARCHAR(256) WVARCHAR(256) TINYINT SMALLINT WCHAR(25) INTEGER BIGINT BIGINT SMALLINT SMALLINT WVARCHAR(65000) WVARCHAR(1) SMALLINT SMALLINT BIGINT BIGINT WCHAR WVARCHAR(10)\n" + "WVARCHAR(1) WVARCHAR(1024) WVARCHAR(256) WVARCHAR(256) TINYINT SMALLINT WCHAR(25) INTEGER INTEGER SMALLINT SMALLINT SMALLINT WVARCHAR(65000) WVARCHAR(1) SMALLINT SMALLINT BIGINT BIGINT WCHAR WVARCHAR(10)\n" "NULL sys sin arg_1 1 7 REAL 24 14 7 2 2 NULL NULL 7 NULL NULL 1 replacedId\n" "NULL sys sin res_0 5 7 REAL 24 14 7 2 2 NULL NULL 7 NULL NULL 0 replacedId\n" "NULL sys sin arg_1 1 8 DOUBLE 53 24 15 2 2 NULL NULL 8 NULL NULL 1 replacedId\n" @@ -1156,7 +1165,7 @@ main(int argc, char **argv) "Resultset with 20 columns\n" "Resultset with 2 rows\n" "PROCEDURE_CAT PROCEDURE_SCHEM PROCEDURE_NAME COLUMN_NAME COLUMN_TYPE DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE SPECIFIC_NAME\n" - "WVARCHAR(1) WVARCHAR(1024) WVARCHAR(256) WVARCHAR(256) TINYINT SMALLINT WCHAR(25) INTEGER BIGINT BIGINT SMALLINT SMALLINT WVARCHAR(65000) WVARCHAR(1) SMALLINT SMALLINT BIGINT BIGINT WCHAR WVARCHAR(10)\n" + "WVARCHAR(1) WVARCHAR(1024) WVARCHAR(256) WVARCHAR(256) TINYINT SMALLINT WCHAR(25) INTEGER INTEGER SMALLINT SMALLINT SMALLINT WVARCHAR(65000) WVARCHAR(1) SMALLINT SMALLINT BIGINT BIGINT WCHAR WVARCHAR(10)\n" "NULL sys env name 3 -9 VARCHAR 1024 2048 NULL NULL 2 NULL NULL -9 NULL 2048 1 replacedId\n" "NULL sys env value 3 -9 VARCHAR 2048 4096 NULL NULL 2 NULL NULL -9 NULL 4096 2 replacedId\n"); @@ -1180,7 +1189,7 @@ main(int argc, char **argv) "Resultset with 20 columns\n" "Resultset with 58 rows\n" "PROCEDURE_CAT PROCEDURE_SCHEM PROCEDURE_NAME COLUMN_NAME COLUMN_TYPE DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE SPECIFIC_NAME\n" - "WVARCHAR(1) WVARCHAR(1024) WVARCHAR(256) WVARCHAR(256) TINYINT SMALLINT WCHAR(25) INTEGER BIGINT BIGINT SMALLINT SMALLINT WVARCHAR(65000) WVARCHAR(1) SMALLINT SMALLINT BIGINT BIGINT WCHAR WVARCHAR(10)\n" + "WVARCHAR(1) WVARCHAR(1024) WVARCHAR(256) WVARCHAR(256) TINYINT SMALLINT WCHAR(25) INTEGER INTEGER SMALLINT SMALLINT SMALLINT WVARCHAR(65000) WVARCHAR(1) SMALLINT SMALLINT BIGINT BIGINT WCHAR WVARCHAR(10)\n" // 0 input argument and 13 result columns of sys.statistics() "NULL sys statistics column_id 3 4 INTEGER 32 11 0 2 2 NULL NULL 4 NULL NULL 1 replacedId\n" "NULL sys statistics schema 3 -9 VARCHAR 1024 2048 NULL NULL 2 NULL NULL -9 NULL 2048 2 replacedId\n"
