Skip to content

Commit 7b8b1dd

Browse files
authored
support of the new SHAPE data type (#185)
This commit adds support for the new SHAPE data type. Supporting it requires acceptance of the data type -- the type is mapped as a text object (like the GEO_* types) and the driver treats it as an opaque text field The commit also updates the set of SQL functions the driver reports as supported by Elasticsearch (as data source).
1 parent eec7dd7 commit 7b8b1dd

File tree

3 files changed

+25
-15
lines changed

3 files changed

+25
-15
lines changed

driver/connect.c

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
/* 5 */
4949
#define TYPE_SHORT "SHORT"
5050
#define TYPE_FLOAT "FLOAT"
51+
#define TYPE_SHAPE "SHAPE"
5152
/* 6 */
5253
#define TYPE_DOUBLE "DOUBLE"
5354
#define TYPE_BINARY "BINARY"
@@ -2015,25 +2016,33 @@ static BOOL elastic_name2types(wstr_st *type_name,
20152016
}
20162017
break;
20172018

2018-
/* 5: SHORT, FLOAT */
2019+
/* 5: SHORT, FLOAT, SHAPE */
20192020
case sizeof(TYPE_SHORT) - 1:
2020-
switch (tolower(type_name->str[0])) {
2021-
case (SQLWCHAR)'s':
2021+
switch (tolower(type_name->str[3])) { /* shoRt, floAt, shaPe */
2022+
case (SQLWCHAR)'r':
20222023
if (! wmemncasecmp(type_name->str, MK_WPTR(TYPE_SHORT),
20232024
type_name->cnt)) {
20242025
*c_sql = ES_SHORT_TO_CSQL;
20252026
*sql = ES_SHORT_TO_SQL;
20262027
return TRUE;
20272028
}
20282029
break;
2029-
case (SQLWCHAR)'f':
2030+
case (SQLWCHAR)'a':
20302031
if (! wmemncasecmp(type_name->str, MK_WPTR(TYPE_FLOAT),
20312032
type_name->cnt)) {
20322033
*c_sql = ES_FLOAT_TO_CSQL;
20332034
*sql = ES_FLOAT_TO_SQL;
20342035
return TRUE;
20352036
}
20362037
break;
2038+
case (SQLWCHAR)'p':
2039+
if (! wmemncasecmp(type_name->str, MK_WPTR(TYPE_SHAPE),
2040+
type_name->cnt)) {
2041+
*c_sql = ES_GEO_TO_CSQL;
2042+
*sql = ES_GEO_TO_SQL;
2043+
return TRUE;
2044+
}
2045+
break;
20372046
}
20382047
break;
20392048

@@ -2452,7 +2461,7 @@ static void *copy_types_rows(esodbc_dbc_st *dbc, estype_row_st *type_row,
24522461
if (types[i].data_type == ESODBC_SQL_BOOLEAN) {
24532462
types[i].data_type = ES_BOOLEAN_TO_SQL;
24542463
}
2455-
/* GEO (SHAPE, POINT) types are WKT encodings */
2464+
/* GEO (SHAPE, POINT), SHAPE types are WKT encodings */
24562465
if (types[i].data_type == ESODBC_SQL_GEO) {
24572466
types[i].data_type = ES_GEO_TO_SQL;
24582467
}

driver/defs.h

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -284,16 +284,17 @@
284284
* Timedate functions support:
285285
* - supported: DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, EXTRACT, HOUR,
286286
* MINUTE, MONTH, MONTHNAME, QUARTER, SECOND, WEEK, YEAR, NOW,
287-
* CURRENT_TIMESTAMP, CURRENT_DATE, CURDATE;
288-
* - not supported: CURRENT_TIME, CURTIME, TIMESTAMPADD, TIMESTAMPDIFF.
287+
* CURRENT_TIMESTAMP, CURRENT_DATE, CURDATE, CURRENT_TIME, CURTIME;
288+
* - not supported: TIMESTAMPADD, TIMESTAMPDIFF.
289289
*/
290290
#define ESODBC_TIMEDATE_FUNCTIONS (0LU | \
291291
SQL_FN_TD_DAYNAME | SQL_FN_TD_DAYOFMONTH | SQL_FN_TD_DAYOFWEEK | \
292292
SQL_FN_TD_DAYOFYEAR | SQL_FN_TD_EXTRACT | SQL_FN_TD_HOUR | \
293293
SQL_FN_TD_MINUTE | SQL_FN_TD_MONTH | SQL_FN_TD_MONTHNAME | \
294294
SQL_FN_TD_QUARTER | SQL_FN_TD_SECOND | SQL_FN_TD_WEEK | \
295295
SQL_FN_TD_YEAR | SQL_FN_TD_NOW | SQL_FN_TD_CURRENT_TIMESTAMP | \
296-
SQL_FN_TD_CURDATE | SQL_FN_TD_CURRENT_DATE )
296+
SQL_FN_TD_CURDATE | SQL_FN_TD_CURRENT_DATE | SQL_FN_TD_CURRENT_TIME | \
297+
SQL_FN_TD_CURTIME)
297298

298299
/*
299300
* TIMESTAMPDIFF timestamp intervals:
@@ -351,11 +352,11 @@
351352
#define ESODBC_SQL92_NUMERIC_VALUE_FUNCTIONS 0LU
352353
/*
353354
* SQL92 datetime functions:
354-
* - supported: CURRENT_DATE, CURRENT_DATETIME.
355-
* - not supported: CURRENT_TIME
355+
* - supported: CURRENT_DATE, CURRENT_DATETIME, CURRENT_TIME.
356+
* - not supported: none.
356357
*/
357358
#define ESODBC_SQL92_DATETIME_FUNCTIONS (0LU | \
358-
SQL_SDF_CURRENT_DATE | SQL_SDF_CURRENT_TIMESTAMP )
359+
SQL_SDF_CURRENT_TIMESTAMP | SQL_SDF_CURRENT_DATE | SQL_SDF_CURRENT_TIME)
359360
/*
360361
* SQL92 datetime literals support:
361362
* - supported: TIMESTAMP, INTERVAL: YEAR/MONTH/DAY/HOUR/MINUTE/SECOND/
@@ -381,11 +382,11 @@
381382
SQL_DL_SQL92_INTERVAL_MINUTE_TO_SECOND )
382383
/*
383384
* SQL92 value functions:
384-
* - supported: COALESCE, NULLIF
385-
* - not supported: CASE, CAST.
385+
* - supported: CASE, CAST, COALESCE, NULLIF
386+
* - not supported: none.
386387
*/
387388
#define ODBC_SQL92_VALUE_EXPRESSIONS (0LU | \
388-
SQL_SVE_COALESCE | SQL_SVE_NULLIF)
389+
SQL_SVE_CASE | SQL_SVE_CAST | SQL_SVE_COALESCE | SQL_SVE_NULLIF)
389390

390391
/*
391392
* ES specific data types

driver/info.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@ static SQLRETURN getinfo_sql(
489489
case SQL_DROP_VIEW:
490490
RET_INFO(SQL_C_ULONG, 0, "[drop statement]");
491491
case SQL_EXPRESSIONS_IN_ORDERBY:
492-
DBGH(dbc, "requested: expressions in order by (0).");
492+
DBGH(dbc, "requested: expressions in order by (Y).");
493493
return write_wstr(dbc, InfoValue, &MK_WSTR("Y"),
494494
BufferLength, StringLengthPtr);
495495
case SQL_GROUP_BY:

0 commit comments

Comments
 (0)