Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 25 additions & 41 deletions driver/connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -2290,12 +2290,11 @@ static void set_display_size(esodbc_estype_st *es_type)
{
switch (es_type->data_type) {
case SQL_CHAR:
case SQL_VARCHAR: /* KEYWORD, TEXT */
case SQL_VARCHAR:
case SQL_LONGVARCHAR:
case SQL_WCHAR:
case SQL_WVARCHAR:
case SQL_WLONGVARCHAR:
// TODO: 45 if IP?
es_type->display_size = es_type->column_size;
break;

Expand Down Expand Up @@ -2465,7 +2464,7 @@ static void *copy_types_rows(esodbc_dbc_st *dbc, estype_row_st *type_row,
SQLWCHAR *pos;
int c;
SQLULEN i;
SQLSMALLINT sql_type, sec_prec;
SQLSMALLINT sec_prec;

/* pointer to start position where the strings will be copied in */
pos = (SQLWCHAR *)&types[rows_fetched];
Expand Down Expand Up @@ -2548,35 +2547,16 @@ static void *copy_types_rows(esodbc_dbc_st *dbc, estype_row_st *type_row,

/* resolve ES type to SQL and SQL C type */
if (! elastic_name2types(&types[i].type_name, &types[i].c_concise_type,
&sql_type)) {
&types[i].data_type)) {
/* ES version newer than driver's? */
ERRH(dbc, "failed to convert type name `" LWPDL "` to SQL C type.",
LWSTR(&types[i].type_name));
return NULL;
}
DBGH(dbc, "ES type `" LWPDL "` resolved to C concise: %hd, SQL: %hd.",
LWSTR(&types[i].type_name), types[i].c_concise_type, sql_type);

/* BOOLEAN is used in catalog calls (like SYS TYPES / SQLGetTypeInfo),
* and the data type is piped through to the app (just like with any
* other statement), which causes issues, since it's not a standard
* type => change it to SQL_BIT */
if (types[i].data_type == ESODBC_SQL_BOOLEAN) {
types[i].data_type = ES_BOOLEAN_TO_SQL;
}
/* GEO (SHAPE, POINT), SHAPE types are WKT encodings */
if (types[i].data_type == ESODBC_SQL_GEO) {
types[i].data_type = ES_GEO_TO_SQL;
}
DBGH(dbc, "ES type `" LWPDL "` resolved to concise: C=%hd, SQL=%hd.",
LWSTR(&types[i].type_name), types[i].c_concise_type,
types[i].data_type);

/* .data_type is used in data conversions -> make sure the SQL type
* derived from type's name is the same with type reported value */
if (sql_type != types[i].data_type) {
ERRH(dbc, "type `" LWPDL "` derived (%d) and reported (%d) SQL "
"type identifiers differ.", LWSTR(&types[i].type_name),
sql_type, types[i].data_type);
return NULL;
}
/* set meta type */
types[i].meta_type = concise_to_meta(types[i].c_concise_type,
/*C type -> AxD*/DESC_TYPE_ARD);
Expand All @@ -2585,8 +2565,9 @@ static void *copy_types_rows(esodbc_dbc_st *dbc, estype_row_st *type_row,
concise_to_type_code(types[i].data_type, &types[i].sql_data_type,
&types[i].sql_datetime_sub);

/* if there's a varchar limit, apply it to string types */
if (types[i].sql_data_type == ESODBC_SQL_STRING) {
/* if there's a set varchar limit, apply it to the string types */
if (types[i].data_type == ES_WVARCHAR_SQL ||
types[i].data_type == ES_VARCHAR_SQL) {
assert(0 <= types[i].column_size);
if (dbc->varchar_limit &&
dbc->varchar_limit < (SQLUINTEGER)types[i].column_size) {
Expand Down Expand Up @@ -2632,26 +2613,29 @@ static void set_es_types(esodbc_dbc_st *dbc, SQLULEN rows_fetched,
assert(dbc->max_varchar_type == NULL);

for (i = 0; i < rows_fetched; i ++) {
if (types[i].data_type == SQL_FLOAT) {
max_float_size = dbc->max_float_type ?
dbc->max_float_type->column_size : 0;
if (max_float_size < types[i].column_size) {
dbc->max_float_type = &types[i];
}
} else if (types[i].data_type == SQL_VARCHAR) {
max_varchar_size = dbc->max_varchar_type ?
dbc->max_varchar_type->column_size : 0;
if (max_varchar_size < types[i].column_size) {
dbc->max_varchar_type = &types[i];
}
switch (types[i].data_type) {
case SQL_DOUBLE:
max_float_size = dbc->max_float_type ?
dbc->max_float_type->column_size : 0;
if (max_float_size < types[i].column_size) {
dbc->max_float_type = &types[i];
}
break;
case ES_VARCHAR_SQL:
case ES_WVARCHAR_SQL:
max_varchar_size = dbc->max_varchar_type ?
dbc->max_varchar_type->column_size : 0;
if (max_varchar_size < types[i].column_size) {
dbc->max_varchar_type = &types[i];
}
}
}

assert(dbc->max_float_type);
assert(dbc->max_varchar_type);

DBGH(dbc, "%lu ES/SQL types available, maximum sizes supported for: "
"SQL_FLOAT: %ld, SQL_VARCHAR: %ld.", (unsigned long)rows_fetched,
"floats: %ld, varchar: %ld.", (unsigned long)rows_fetched,
dbc->max_float_type->column_size, dbc->max_varchar_type->column_size);
}

Expand Down
76 changes: 0 additions & 76 deletions driver/connect.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,82 +12,6 @@
#include "dsn.h"


/*
* ES-to-C-SQL mappings.
* DATA_TYPE(SYS TYPES) : SQL_<type> -> SQL_C_<type>
* Intervals not covered, since C==SQL, with no ES customization.
*/
/* -6: SQL_TINYINT -> SQL_C_TINYINT */
#define ES_BYTE_TO_CSQL SQL_C_TINYINT
#define ES_BYTE_TO_SQL SQL_TINYINT
/* 5: SQL_SMALLINT -> SQL_C_SHORT */
#define ES_SHORT_TO_CSQL SQL_C_SSHORT
#define ES_SHORT_TO_SQL SQL_SMALLINT
/* 4: SQL_INTEGER -> SQL_C_LONG */
#define ES_INTEGER_TO_CSQL SQL_C_SLONG
#define ES_INTEGER_TO_SQL SQL_INTEGER
/* -5: SQL_BIGINT -> SQL_C_SBIGINT */
#define ES_LONG_TO_CSQL SQL_C_SBIGINT
#define ES_LONG_TO_SQL SQL_BIGINT
/* 6: SQL_FLOAT -> SQL_C_DOUBLE */
#define ES_HALF_TO_CSQL_FLOAT SQL_C_DOUBLE
#define ES_HALF_TO_SQL_FLOAT SQL_FLOAT
/* 6: SQL_FLOAT -> SQL_C_DOUBLE */
#define ES_SCALED_TO_CSQL_FLOAT SQL_C_DOUBLE
#define ES_SCALED_TO_SQL_FLOAT SQL_DOUBLE
/* 7: SQL_REAL -> SQL_C_DOUBLE */
#define ES_FLOAT_TO_CSQL SQL_C_FLOAT
#define ES_FLOAT_TO_SQL SQL_REAL
/* 8: SQL_DOUBLE -> SQL_C_FLOAT */
#define ES_DOUBLE_TO_CSQL SQL_C_DOUBLE
#define ES_DOUBLE_TO_SQL SQL_DOUBLE
/* 16: ??? -> SQL_C_TINYINT */
#define ES_BOOLEAN_TO_CSQL SQL_C_BIT
#define ES_BOOLEAN_TO_SQL SQL_BIT
/* 12: SQL_VARCHAR -> SQL_C_WCHAR */
#define ES_KEYWORD_TO_CSQL SQL_C_WCHAR
#define ES_KEYWORD_TO_SQL SQL_VARCHAR
/* 12: SQL_VARCHAR -> SQL_C_WCHAR */
#define ES_CKEYWORD_TO_CSQL SQL_C_WCHAR
#define ES_CKEYWORD_TO_SQL SQL_VARCHAR
/* 12: SQL_VARCHAR -> SQL_C_WCHAR */
#define ES_TEXT_TO_CSQL SQL_C_WCHAR
#define ES_TEXT_TO_SQL SQL_VARCHAR
/* 12: SQL_VARCHAR -> SQL_C_WCHAR */
#define ES_IP_TO_CSQL SQL_C_WCHAR
#define ES_IP_TO_SQL SQL_VARCHAR
/* 92: SQL_TYPE_TIME -> SQL_C_TYPE_TIME */
#define ES_TIME_TO_CSQL SQL_C_TYPE_TIME
#define ES_TIME_TO_SQL SQL_TYPE_TIME
/* 91: SQL_TYPE_DATE -> SQL_C_TYPE_DATE */
#define ES_DATE_TO_CSQL SQL_C_TYPE_DATE
#define ES_DATE_TO_SQL SQL_TYPE_DATE
/* 93: SQL_TYPE_TIMESTAMP -> SQL_C_TYPE_TIMESTAMP */
#define ES_DATETIME_TO_CSQL SQL_C_TYPE_TIMESTAMP
#define ES_DATETIME_TO_SQL SQL_TYPE_TIMESTAMP
/* -3: SQL_VARBINARY -> SQL_C_BINARY */
#define ES_BINARY_TO_CSQL SQL_C_BINARY
#define ES_BINARY_TO_SQL SQL_BINARY
/* 0: SQL_TYPE_NULL -> SQL_C_TINYINT */
#define ES_NULL_TO_CSQL SQL_C_STINYINT // ???
#define ES_NULL_TO_SQL SQL_TYPE_NULL
/*
* ES-non mappable
*/
/* 114: ??? -> SQL_C_WCHAR */
#define ES_GEO_TO_CSQL SQL_C_WCHAR /* XXX: CBOR needs _CHAR */
#define ES_GEO_TO_SQL SQL_VARCHAR

/* 1111: ??? -> SQL_C_BINARY */
#define ES_UNSUPPORTED_TO_CSQL SQL_C_BINARY
#define ES_UNSUPPORTED_TO_SQL ESODBC_SQL_UNSUPPORTED
/* 2002: ??? -> SQL_C_BINARY */
#define ES_OBJECT_TO_CSQL SQL_C_BINARY
#define ES_OBJECT_TO_SQL ESODBC_SQL_OBJECT
/* 2002: ??? -> SQL_C_BINARY */
#define ES_NESTED_TO_CSQL SQL_C_BINARY
#define ES_NESTED_TO_SQL ESODBC_SQL_NESTED


BOOL connect_init();
void connect_cleanup();
Expand Down
5 changes: 3 additions & 2 deletions driver/convert.c
Original file line number Diff line number Diff line change
Expand Up @@ -1859,7 +1859,8 @@ static SQLRETURN wstr_to_timestamp_struct(esodbc_rec_st *arec,
}
break;
case SQL_TYPE_TIME:
case SQL_VARCHAR:
case ES_VARCHAR_SQL:
case ES_WVARCHAR_SQL:
ret = parse_date_time_ts(stmt, &xstr, /*sql2c*/TRUE, tss,
format);
if (! SQL_SUCCEEDED(ret)) {
Expand Down Expand Up @@ -2783,7 +2784,7 @@ static SQLRETURN sql2c_interval(esodbc_rec_st *arec,
}

/* split processing by the source type */
if (sqltype == SQL_VARCHAR) {
if (sqltype == ES_WVARCHAR_SQL || sqltype == ES_VARCHAR_SQL) {
ret = parse_interval_literal(arec, wstr, &ivl);
assert(0 <= ivl.interval_type && ivl.interval_type <=
sizeof(ivl_type2c_type)/sizeof(ivl_type2c_type[0]));
Expand Down
96 changes: 93 additions & 3 deletions driver/defs.h
Original file line number Diff line number Diff line change
Expand Up @@ -404,9 +404,6 @@
#define ODBC_SQL92_VALUE_EXPRESSIONS (0LU | \
SQL_SVE_CASE | SQL_SVE_CAST | SQL_SVE_COALESCE | SQL_SVE_NULLIF)

/* the type ES/SQL uses for string types (KEYWORD, TEXT, CONSTANT_KEYWORD),
* plus IP and GEO */
#define ESODBC_SQL_STRING SQL_VARCHAR
/*
* ES specific data types
*/
Expand All @@ -417,6 +414,99 @@
#define ESODBC_SQL_OBJECT 2002
#define ESODBC_SQL_NESTED 2002

/* the SQL type ES/SQL uses for string types (KEYWORD, TEXT, CONSTANT_KEYWORD),
* plus IP and GEO */
#define ESODBC_SQL_VARCHAR SQL_VARCHAR

/* C SQL and SQL types for ES types that
* - contain UTF8 chars */
#define ES_WVARCHAR_CSQL SQL_C_WCHAR
#define ES_WVARCHAR_SQL SQL_WVARCHAR
/* - contain ANSI chars */
#define ES_VARCHAR_CSQL SQL_C_CHAR
#define ES_VARCHAR_SQL SQL_VARCHAR
/*
* ES-to-C-SQL mappings.
* DATA_TYPE(SYS TYPES) : SQL_<type> -> SQL_C_<type>
* Intervals not covered, since C==SQL, with no ES customization.
*/
/* -6: BYTE */
#define ES_BYTE_TO_CSQL SQL_C_TINYINT
#define ES_BYTE_TO_SQL SQL_TINYINT
/* 5: SHORT */
#define ES_SHORT_TO_CSQL SQL_C_SSHORT
#define ES_SHORT_TO_SQL SQL_SMALLINT
/* 4: INTEGER */
#define ES_INTEGER_TO_CSQL SQL_C_SLONG
#define ES_INTEGER_TO_SQL SQL_INTEGER
/* -5: LONG */
#define ES_LONG_TO_CSQL SQL_C_SBIGINT
#define ES_LONG_TO_SQL SQL_BIGINT
/* 6: HALF_FLOAT */
#define ES_HALF_TO_CSQL_FLOAT SQL_C_DOUBLE
#define ES_HALF_TO_SQL_FLOAT SQL_FLOAT
/* 7: FLOAT */
#define ES_FLOAT_TO_CSQL SQL_C_FLOAT
#define ES_FLOAT_TO_SQL SQL_REAL
/* 8: DOUBLE */
#define ES_DOUBLE_TO_CSQL SQL_C_DOUBLE
#define ES_DOUBLE_TO_SQL SQL_DOUBLE
/* 8: SCALED_FLOAT */
#define ES_SCALED_TO_CSQL_FLOAT SQL_C_DOUBLE
#define ES_SCALED_TO_SQL_FLOAT SQL_DOUBLE
/* 16: BOOLEAN */
#define ES_BOOLEAN_TO_CSQL SQL_C_BIT
/* BOOLEAN is used in catalog calls (like SYS TYPES / SQLGetTypeInfo), and the
* data type is piped through to the app (just like with any other statement),
* which causes issues, since it's not a standard type => use ODBC's SQL_BIT */
#define ES_BOOLEAN_TO_SQL SQL_BIT
/* 12: KEYWORD */
#define ES_KEYWORD_TO_CSQL ES_WVARCHAR_CSQL
#define ES_KEYWORD_TO_SQL ES_WVARCHAR_SQL
/* 12: CONSTANT_KEYWORD */
#define ES_CKEYWORD_TO_CSQL ES_WVARCHAR_CSQL
#define ES_CKEYWORD_TO_SQL ES_WVARCHAR_SQL
/* 12: TEXT */
#define ES_TEXT_TO_CSQL ES_WVARCHAR_CSQL
#define ES_TEXT_TO_SQL ES_WVARCHAR_SQL
/* 12: IP */
#define ES_IP_TO_CSQL ES_VARCHAR_CSQL
#define ES_IP_TO_SQL ES_VARCHAR_SQL
/* 92: TIME */
#define ES_TIME_TO_CSQL SQL_C_TYPE_TIME
#define ES_TIME_TO_SQL SQL_TYPE_TIME
/* 91: DATE */
#define ES_DATE_TO_CSQL SQL_C_TYPE_DATE
#define ES_DATE_TO_SQL SQL_TYPE_DATE
/* 93: DATETIME (TIMESTAMP) */
#define ES_DATETIME_TO_CSQL SQL_C_TYPE_TIMESTAMP
#define ES_DATETIME_TO_SQL SQL_TYPE_TIMESTAMP
/* -3: BINARY */
#define ES_BINARY_TO_CSQL SQL_C_BINARY
#define ES_BINARY_TO_SQL SQL_BINARY
/* 0: NULL */
/* there's no standard C SQL ID for a NULL type (but there's a SQL one); so
* map it to a valid C SQL ID (though it should actually be used). */
#define ES_NULL_TO_CSQL SQL_C_STINYINT
#define ES_NULL_TO_SQL SQL_TYPE_NULL
/*
* ES-non mappable
*/
/* 114: GEO_POINT/_SHAPE, SHAPE */
#define ES_GEO_TO_CSQL ES_VARCHAR_CSQL
/* WKT encodings */
#define ES_GEO_TO_SQL ES_VARCHAR_SQL

/* 1111: UNSUPPORTED */
#define ES_UNSUPPORTED_TO_CSQL SQL_C_BINARY
#define ES_UNSUPPORTED_TO_SQL ESODBC_SQL_UNSUPPORTED
/* 2002: OBJECT */
#define ES_OBJECT_TO_CSQL SQL_C_BINARY
#define ES_OBJECT_TO_SQL ESODBC_SQL_OBJECT
/* 2002: NESTED */
#define ES_NESTED_TO_CSQL SQL_C_BINARY
#define ES_NESTED_TO_SQL ESODBC_SQL_NESTED


#endif /* __DEFS_H__ */

Expand Down
Loading