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

Reply via email to