Changeset: 0865c61f5409 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/0865c61f5409 Modified Files: sql/backends/monet5/vaults/odbc/odbc_loader.c Branch: odbc_loader Log Message:
Correct mapping of ODBC sql types to names expected by sql_bind_subtype(). diffs (164 lines): diff --git a/sql/backends/monet5/vaults/odbc/odbc_loader.c b/sql/backends/monet5/vaults/odbc/odbc_loader.c --- a/sql/backends/monet5/vaults/odbc/odbc_loader.c +++ b/sql/backends/monet5/vaults/odbc/odbc_loader.c @@ -51,11 +51,11 @@ odbc_cleanup(SQLHANDLE env, SQLHANDLE db } } - static sql_subtype * map_rescol_type(SQLSMALLINT dataType, SQLULEN columnSize, SQLSMALLINT decimalDigits, mvc * sql) { char * typenm; + int interval_type = 0; switch (dataType) { case SQL_CHAR: @@ -64,18 +64,25 @@ map_rescol_type(SQLSMALLINT dataType, SQ case SQL_WCHAR: case SQL_WVARCHAR: case SQL_WLONGVARCHAR: - default: + default: /* all other ODBC types are also mapped to varchar for now */ + /* all ODBC char datatypes are mapped to varchar. char and clob are internally not used anymore */ return sql_bind_subtype(sql->sa, "varchar", (int) columnSize, 0); - case SQL_DECIMAL: - case SQL_NUMERIC: - return sql_bind_subtype(sql->sa, "decimal", (int) decimalDigits, 6); - case SQL_BINARY: case SQL_VARBINARY: case SQL_LONGVARBINARY: return sql_bind_subtype(sql->sa, "blob", (int) columnSize, 0); + case SQL_DECIMAL: + case SQL_NUMERIC: + /* columnSize contains the defined number of digits, so precision. */ + /* decimalDigits contains the scale (which can be negative). */ + return sql_bind_subtype(sql->sa, "decimal", (int) columnSize, (int) decimalDigits); + + case SQL_BIT: + typenm = "boolean"; + break; + case SQL_TINYINT: typenm = "tinyint"; break; @@ -83,11 +90,12 @@ map_rescol_type(SQLSMALLINT dataType, SQ typenm = "smallint"; break; case SQL_INTEGER: - typenm = "integer"; + typenm = "int"; break; case SQL_BIGINT: typenm = "bigint"; break; + case SQL_REAL: typenm = "real"; break; @@ -95,65 +103,81 @@ map_rescol_type(SQLSMALLINT dataType, SQ typenm = "double"; break; case SQL_FLOAT: - typenm = "float"; + /* the precision of SQL_FLOAT can be either 24 or 53: if it is 24, the SQL_FLOAT data type is the same as SQL_REAL; if it is 53, the SQL_FLOAT data type is the same as SQL_DOUBLE. */ + typenm = (columnSize == 7) ? "real" : "double"; break; + case SQL_TYPE_DATE: typenm = "date"; break; case SQL_TYPE_TIME: + /* decimalDigits contains the precision of fractions of a second */ typenm = "time"; break; case SQL_TYPE_TIMESTAMP: - typenm = "timeestamp"; + /* decimalDigits contains the precision of fractions of a second */ + typenm = "timestamp"; break; - case SQL_BIT: - typenm = "boolean"; - break; + case SQL_INTERVAL_MONTH: - typenm = "INTERVAL MONTH"; + typenm = "month_interval"; + interval_type = 3; break; case SQL_INTERVAL_YEAR: - typenm = "INTERVAL YEAR"; + typenm = "month_interval"; + interval_type = 1; break; case SQL_INTERVAL_YEAR_TO_MONTH: - typenm = "INTERVAL YEAR TO MONTH"; + typenm = "month_interval"; + interval_type = 2; break; case SQL_INTERVAL_DAY: - typenm = "INTERVAL DAY"; + typenm = "day_interval"; + interval_type = 4; break; case SQL_INTERVAL_HOUR: - typenm = "INTERVAL HOUR"; + typenm = "sec_interval"; + interval_type = 8; break; case SQL_INTERVAL_MINUTE: - typenm = "INTERVAL MINUTE"; + typenm = "sec_interval"; + interval_type = 11; break; case SQL_INTERVAL_SECOND: - typenm = "INTERVAL SECOND"; + typenm = "sec_interval"; + interval_type = 13; break; case SQL_INTERVAL_DAY_TO_HOUR: - typenm = "INTERVAL DAY TO HOUR"; + typenm = "sec_interval"; + interval_type = 5; break; case SQL_INTERVAL_DAY_TO_MINUTE: - typenm = "INTERVAL DAY TO MINUTE"; + typenm = "sec_interval"; + interval_type = 6; break; case SQL_INTERVAL_DAY_TO_SECOND: - typenm = "INTERVAL DAY TO SECOND"; + typenm = "sec_interval"; + interval_type = 7; break; case SQL_INTERVAL_HOUR_TO_MINUTE: - typenm = "INTERVAL HOUR TO MINUTE"; + typenm = "sec_interval"; + interval_type = 9; break; case SQL_INTERVAL_HOUR_TO_SECOND: - typenm = "INTERVAL HOUR TO SECOND"; + typenm = "sec_interval"; + interval_type = 10; break; case SQL_INTERVAL_MINUTE_TO_SECOND: - typenm = "INTERVAL MINUTE TO SECOND"; + typenm = "sec_interval"; + interval_type = 12; break; + case SQL_GUID: - typenm = "UUID"; + /* represents a uuid of length 36, such as: dbe7343c-1f11-4fa9-a9c8-a31cd26f92fe */ + typenm = "uuid"; break; } - - return sql_bind_subtype(sql->sa, typenm, 0, 0); + return sql_bind_subtype(sql->sa, typenm, interval_type, 0); } /* _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org