Changeset: 11ce4397edec for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/11ce4397edec
Modified Files:
clients/odbc/driver/ODBCQueries.h
clients/odbc/driver/SQLSpecialColumns.c
clients/odbc/tests/ODBCmetadata.c
Branch: default
Log Message:
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.
diffs (188 lines):
diff --git a/clients/odbc/driver/ODBCQueries.h
b/clients/odbc/driver/ODBCQueries.h
--- 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 "
\
diff --git a/clients/odbc/driver/SQLSpecialColumns.c
b/clients/odbc/driver/SQLSpecialColumns.c
--- 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\", "
diff --git a/clients/odbc/tests/ODBCmetadata.c
b/clients/odbc/tests/ODBCmetadata.c
--- 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"
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]