Skip to content

Commit 62e49da

Browse files
committed
Introduce support for the TIME data type conversions (#144)
* update unit test data type defs - update the data type parameters in the unit tests as currently provided by ES/SQL: the floating point data types have been adjusted and TIME type introduced. * 'calcs' dataset pipeline now allows NULLs - update the pipeline for 'calcs' dataset so that NULLs are propagated. * add SQL-to-C convertability for TIME data type This commit adds the mandated SQL-to-C convertability of the TIME data type: - ES/SQL TIME, ISO 8601 format on one side and - TIME_STRUCT, TIMESTAMP_STRUCT, ODBC literals, ISO8601 on the other. Most of the existing time types code has been already prepared for this type so it could be reused; the TZ+DST offsetting has been extracted into own functions. * fix catalog parameter lengths checks - check the lenght of provided catalog args also in the case they aren't NULL-terminated. * add C-to-SQL TIME conversions Conversions from TIME, DATETIME (TIMESTAMP) and Strings to ES/SQL TIME data type are now supported by the driver. * fix C-to-SQL conversions for DATE - the TIME portion of the ISO8601 timestamp used by ES/SQL needs to be zeroed too; - also re-enable integration testing (disabling chunk unintentionally committed). * fix simulated return format in test - addressing PR review notes, to consistently contain the tested operation as result column name (cherry picked from commit 18643b7)
1 parent f46b8c5 commit 62e49da

19 files changed

+1339
-428
lines changed

driver/catalogue.c

Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -296,16 +296,16 @@ SQLRETURN EsSQLTablesW(
296296
esrc.str = CatalogName;
297297
if (NameLength1 == SQL_NTS) {
298298
esrc.cnt = wcslen(esrc.str);
299-
if (ESODBC_MAX_IDENTIFIER_LEN < esrc.cnt) {
300-
ERRH(stmt, "catalog identifier name '" LWPDL "' too long "
301-
"(%zd. max=%d).", LWSTR(&esrc), esrc.cnt,
302-
ESODBC_MAX_IDENTIFIER_LEN);
303-
SET_HDIAG(stmt, SQL_STATE_HY090, "catalog name too long", 0);
304-
goto end;
305-
}
306299
} else {
307300
esrc.cnt = NameLength1;
308301
}
302+
if (ESODBC_MAX_IDENTIFIER_LEN < esrc.cnt) {
303+
ERRH(stmt, "catalog identifier name '" LWPDL "' too long "
304+
"(%zd. max=%d).", LWSTR(&esrc), esrc.cnt,
305+
ESODBC_MAX_IDENTIFIER_LEN);
306+
SET_HDIAG(stmt, SQL_STATE_HY090, "catalog name too long", 0);
307+
goto end;
308+
}
309309

310310
if (dbc->auto_esc_pva || stmt->metadata_id) {
311311
metadata_id_escape(&esrc, &edst, (BOOL)stmt->metadata_id);
@@ -326,16 +326,16 @@ SQLRETURN EsSQLTablesW(
326326
esrc.str = SchemaName;
327327
if (NameLength2 == SQL_NTS) {
328328
esrc.cnt = wcslen(esrc.str);
329-
if (ESODBC_MAX_IDENTIFIER_LEN < esrc.cnt) {
330-
ERRH(stmt, "schema identifier name '" LWPDL "' too long "
331-
"(%zd. max=%d).", LWSTR(&esrc), esrc.cnt,
332-
ESODBC_MAX_IDENTIFIER_LEN);
333-
SET_HDIAG(stmt, SQL_STATE_HY090, "schema name too long", 0);
334-
goto end;
335-
}
336329
} else {
337330
esrc.cnt = NameLength2;
338331
}
332+
if (ESODBC_MAX_IDENTIFIER_LEN < esrc.cnt) {
333+
ERRH(stmt, "schema identifier name '" LWPDL "' too long "
334+
"(%zd. max=%d).", LWSTR(&esrc), esrc.cnt,
335+
ESODBC_MAX_IDENTIFIER_LEN);
336+
SET_HDIAG(stmt, SQL_STATE_HY090, "schema name too long", 0);
337+
goto end;
338+
}
339339

340340
/* TODO: server support needed for sch. name filtering */
341341
if (wszmemcmp(esrc.str, MK_WPTR(SQL_ALL_SCHEMAS), (long)esrc.cnt)) {
@@ -350,16 +350,16 @@ SQLRETURN EsSQLTablesW(
350350
esrc.str = TableName;
351351
if (NameLength3 == SQL_NTS) {
352352
esrc.cnt = wcslen(esrc.str);
353-
if (ESODBC_MAX_IDENTIFIER_LEN < esrc.cnt) {
354-
ERRH(stmt, "table identifier name '" LWPDL "' too long "
355-
"(%zd. max=%d).", LWSTR(&esrc), esrc.cnt,
356-
ESODBC_MAX_IDENTIFIER_LEN);
357-
SET_HDIAG(stmt, SQL_STATE_HY090, "table name too long", 0);
358-
goto end;
359-
}
360353
} else {
361354
esrc.cnt = NameLength3;
362355
}
356+
if (ESODBC_MAX_IDENTIFIER_LEN < esrc.cnt) {
357+
ERRH(stmt, "table identifier name '" LWPDL "' too long "
358+
"(%zd. max=%d).", LWSTR(&esrc), esrc.cnt,
359+
ESODBC_MAX_IDENTIFIER_LEN);
360+
SET_HDIAG(stmt, SQL_STATE_HY090, "table name too long", 0);
361+
goto end;
362+
}
363363

364364
if (dbc->auto_esc_pva || stmt->metadata_id) {
365365
metadata_id_escape(&esrc, &edst, (BOOL)stmt->metadata_id);
@@ -380,16 +380,16 @@ SQLRETURN EsSQLTablesW(
380380
esrc.str = TableType;
381381
if (NameLength4 == SQL_NTS) {
382382
esrc.cnt = wcslen(esrc.str);
383-
if (ESODBC_MAX_IDENTIFIER_LEN < esrc.cnt) {
384-
ERRH(stmt, "type identifier name '" LWPDL "' too long "
385-
"(%zd. max=%d).", LWSTR(&esrc), esrc.cnt,
386-
ESODBC_MAX_IDENTIFIER_LEN);
387-
SET_HDIAG(stmt, SQL_STATE_HY090, "type name too long", 0);
388-
goto end;
389-
}
390383
} else {
391384
esrc.cnt = NameLength4;
392385
}
386+
if (ESODBC_MAX_IDENTIFIER_LEN < esrc.cnt) {
387+
ERRH(stmt, "type identifier name '" LWPDL "' too long "
388+
"(%zd. max=%d).", LWSTR(&esrc), esrc.cnt,
389+
ESODBC_MAX_IDENTIFIER_LEN);
390+
SET_HDIAG(stmt, SQL_STATE_HY090, "type name too long", 0);
391+
goto end;
392+
}
393393

394394
/* Only print TYPE if non-empty. This is incorrect, by the book,
395395
* but there's little use to specifying an empty string as the type
@@ -453,15 +453,15 @@ SQLRETURN EsSQLColumnsW
453453
catalog.str = szCatalogName;
454454
if (cchCatalogName == SQL_NTS) {
455455
catalog.cnt = wcslen(catalog.str);
456-
if (ESODBC_MAX_IDENTIFIER_LEN < catalog.cnt) {
457-
ERRH(stmt, "catalog identifier name '" LWPDL "' too long "
458-
"(%d. max=%d).", LWSTR(&catalog), catalog.cnt,
459-
ESODBC_MAX_IDENTIFIER_LEN);
460-
RET_HDIAG(stmt, SQL_STATE_HY090, "catalog name too long", 0);
461-
}
462456
} else {
463457
catalog.cnt = cchCatalogName;
464458
}
459+
if (ESODBC_MAX_IDENTIFIER_LEN < catalog.cnt) {
460+
ERRH(stmt, "catalog identifier name '" LWPDL "' too long "
461+
"(%d. max=%d).", LWSTR(&catalog), catalog.cnt,
462+
ESODBC_MAX_IDENTIFIER_LEN);
463+
RET_HDIAG(stmt, SQL_STATE_HY090, "catalog name too long", 0);
464+
}
465465
} else {
466466
catalog.str = NULL;
467467
catalog.cnt = 0;
@@ -471,15 +471,15 @@ SQLRETURN EsSQLColumnsW
471471
schema.str = szSchemaName;
472472
if (cchSchemaName == SQL_NTS) {
473473
schema.cnt = wcslen(schema.str);
474-
if (ESODBC_MAX_IDENTIFIER_LEN < schema.cnt) {
475-
ERRH(stmt, "schema identifier name '" LWPDL "' too long "
476-
"(%d. max=%d).", LWSTR(&schema), schema.cnt,
477-
ESODBC_MAX_IDENTIFIER_LEN);
478-
RET_HDIAG(stmt, SQL_STATE_HY090, "schema name too long", 0);
479-
}
480474
} else {
481475
schema.cnt = cchSchemaName;
482476
}
477+
if (ESODBC_MAX_IDENTIFIER_LEN < schema.cnt) {
478+
ERRH(stmt, "schema identifier name '" LWPDL "' too long "
479+
"(%d. max=%d).", LWSTR(&schema), schema.cnt,
480+
ESODBC_MAX_IDENTIFIER_LEN);
481+
RET_HDIAG(stmt, SQL_STATE_HY090, "schema name too long", 0);
482+
}
483483
} else {
484484
schema.str = MK_WPTR(SQL_ALL_SCHEMAS);
485485
schema.cnt = sizeof(SQL_ALL_SCHEMAS) - /*0-term*/1;
@@ -496,15 +496,15 @@ SQLRETURN EsSQLColumnsW
496496
src_tab.str = szTableName;
497497
if (cchTableName == SQL_NTS) {
498498
src_tab.cnt = wcslen(src_tab.str);
499-
if (ESODBC_MAX_IDENTIFIER_LEN < src_tab.cnt) {
500-
ERRH(stmt, "table identifier name '" LWPDL "' too long "
501-
"(%d. max=%d).", LWSTR(&src_tab), src_tab.cnt,
502-
ESODBC_MAX_IDENTIFIER_LEN);
503-
RET_HDIAG(stmt, SQL_STATE_HY090, "table name too long", 0);
504-
}
505499
} else {
506500
src_tab.cnt = cchTableName;
507501
}
502+
if (ESODBC_MAX_IDENTIFIER_LEN < src_tab.cnt) {
503+
ERRH(stmt, "table identifier name '" LWPDL "' too long "
504+
"(%d. max=%d).", LWSTR(&src_tab), src_tab.cnt,
505+
ESODBC_MAX_IDENTIFIER_LEN);
506+
RET_HDIAG(stmt, SQL_STATE_HY090, "table name too long", 0);
507+
}
508508
} else {
509509
src_tab.str = MK_WPTR(ESODBC_ALL_TABLES);
510510
src_tab.cnt = sizeof(ESODBC_ALL_TABLES) - /*0-term*/1;
@@ -514,15 +514,15 @@ SQLRETURN EsSQLColumnsW
514514
src_col.str = szColumnName;
515515
if (cchColumnName == SQL_NTS) {
516516
src_col.cnt = wcslen(src_col.str);
517-
if (ESODBC_MAX_IDENTIFIER_LEN < src_col.cnt) {
518-
ERRH(stmt, "column identifier name '" LWPDL "' too long "
519-
"(%d. max=%d).", LWSTR(&src_col), src_col.cnt,
520-
ESODBC_MAX_IDENTIFIER_LEN);
521-
RET_HDIAG(stmt, SQL_STATE_HY090, "column name too long", 0);
522-
}
523517
} else {
524518
src_col.cnt = cchColumnName;
525519
}
520+
if (ESODBC_MAX_IDENTIFIER_LEN < src_col.cnt) {
521+
ERRH(stmt, "column identifier name '" LWPDL "' too long "
522+
"(%d. max=%d).", LWSTR(&src_col), src_col.cnt,
523+
ESODBC_MAX_IDENTIFIER_LEN);
524+
RET_HDIAG(stmt, SQL_STATE_HY090, "column name too long", 0);
525+
}
526526
} else {
527527
src_col.str = MK_WPTR(ESODBC_ALL_COLUMNS);
528528
src_col.cnt = sizeof(ESODBC_ALL_COLUMNS) - /*0-term*/1;

driver/connect.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#define TYPE_LONG "LONG"
3737
#define TYPE_TEXT "TEXT"
3838
#define TYPE_DATE "DATE"
39+
#define TYPE_TIME "TIME"
3940
#define TYPE_NULL "NULL"
4041
/* 5 */
4142
#define TYPE_SHORT "SHORT"
@@ -1749,7 +1750,7 @@ static BOOL elastic_name2types(wstr_st *type_name,
17491750
}
17501751
break;
17511752

1752-
/* 4: BYTE, LONG, TEXT, DATE, NULL */
1753+
/* 4: BYTE, LONG, TEXT, DATE, TIME, NULL */
17531754
case sizeof(TYPE_BYTE) - 1:
17541755
switch (tolower(type_name->str[0])) {
17551756
case (SQLWCHAR)'b':
@@ -1768,13 +1769,19 @@ static BOOL elastic_name2types(wstr_st *type_name,
17681769
return TRUE;
17691770
}
17701771
break;
1771-
case (SQLWCHAR)'t':
1772+
case (SQLWCHAR)'t': /* TEXT, TIME */
17721773
if (! wmemncasecmp(type_name->str, MK_WPTR(TYPE_TEXT),
17731774
type_name->cnt)) {
17741775
*c_sql = ES_TEXT_TO_CSQL;
17751776
*sql = ES_TEXT_TO_SQL;
17761777
return TRUE;
17771778
}
1779+
if (! wmemncasecmp(type_name->str, MK_WPTR(TYPE_TIME),
1780+
type_name->cnt)) {
1781+
*c_sql = SQL_C_TYPE_TIME;
1782+
*sql = SQL_TYPE_TIME;
1783+
return TRUE;
1784+
}
17781785
break;
17791786
case (SQLWCHAR)'d':
17801787
if (! wmemncasecmp(type_name->str, MK_WPTR(TYPE_DATE),

driver/connect.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
#define ES_HALF_TO_SQL_FLOAT SQL_FLOAT
3535
/* 6: SQL_FLOAT -> SQL_C_DOUBLE */
3636
#define ES_SCALED_TO_CSQL_FLOAT SQL_C_DOUBLE
37-
#define ES_SCALED_TO_SQL_FLOAT SQL_FLOAT
37+
#define ES_SCALED_TO_SQL_FLOAT SQL_DOUBLE
3838
/* 7: SQL_REAL -> SQL_C_DOUBLE */
3939
#define ES_FLOAT_TO_CSQL SQL_C_FLOAT
4040
#define ES_FLOAT_TO_SQL SQL_REAL
@@ -53,6 +53,9 @@
5353
/* 12: SQL_VARCHAR -> SQL_C_WCHAR */
5454
#define ES_IP_TO_CSQL SQL_C_WCHAR /* XXX: CBOR needs _CHAR */
5555
#define ES_IP_TO_SQL SQL_VARCHAR
56+
/* 92: SQL_TYPE_TIME -> SQL_C_TYPE_TIME */
57+
#define ES_TIME_TO_CSQL SQL_C_TYPE_TIME
58+
#define ES_TIME_TO_SQL SQL_TYPE_TIME
5659
/* 91: SQL_TYPE_DATE -> SQL_C_TYPE_DATE */
5760
#define ES_DATE_TO_CSQL SQL_C_TYPE_DATE
5861
#define ES_DATE_TO_SQL SQL_TYPE_DATE

0 commit comments

Comments
 (0)