Changeset: f7fa51ee4d8a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f7fa51ee4d8a
Modified Files:
        clients/odbc/tests/ODBCtester.c
Branch: Mar2025
Log Message:

Add ODBC driver test to retrieve an interval_day which is larger than 99 days. 
It returns error SQLstate 22015 Interval field overflow.
Also when retrieving an interval_day as int it returns error SQLstate 07006 
Restricted data type attribute violation.
Both needs to be fixed (WIP in ODBCConvert.c)


diffs (183 lines):

diff --git a/clients/odbc/tests/ODBCtester.c b/clients/odbc/tests/ODBCtester.c
--- a/clients/odbc/tests/ODBCtester.c
+++ b/clients/odbc/tests/ODBCtester.c
@@ -29,7 +29,7 @@
 static void
 prerr(SQLSMALLINT tpe, SQLHANDLE hnd, const char *func, const char *pref)
 {
-       SQLCHAR state[6];
+       SQLCHAR state[SQL_SQLSTATE_SIZE +1];
        SQLINTEGER errnr;
        SQLCHAR msg[256];
        SQLSMALLINT msglen;
@@ -207,6 +207,9 @@ testGetDataTruncatedString(SQLHANDLE stm
                        "SQLstate 01004, Errnr 0, Message [MonetDB][ODBC Driver 
11.##.#][MonetDB-Test]String data, right truncated\n");
        }
 
+       ret = SQLCloseCursor(stmt);
+       check(ret, SQL_HANDLE_STMT, stmt, "SQLCloseCursor");
+
        /* cleanup */
        free(outp);
        return ret;
@@ -266,7 +269,7 @@ testGetDataGUID(SQLHANDLE stmt)
                        pos += snprintf(outp + pos, outp_len - pos, "NULL\n");
                else
                        pos += snprintf(outp + pos, outp_len - pos, 
"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
-                                       (unsigned int) guid_val.Data1, 
guid_val.Data2, guid_val.Data3,
+                               guid_val.Data1, guid_val.Data2, guid_val.Data3,
                                guid_val.Data4[0], guid_val.Data4[1], 
guid_val.Data4[2], guid_val.Data4[3], guid_val.Data4[4], guid_val.Data4[5], 
guid_val.Data4[6], guid_val.Data4[7]);
                check(ret, SQL_HANDLE_STMT, stmt, "SQLGetData(col)");
        }
@@ -286,6 +289,121 @@ testGetDataGUID(SQLHANDLE stmt)
                        "SQLGetData(3, SQL_C_CHAR, 36) returns 0, vallen 36, 
str_val: 'beefc4f7-0264-4735-9b7a-75fd371ef803'\n"
                        "SQLGetData(3, SQL_C_GUID, 16) returns 0, vallen 16, 
data_val: beefc4f7-0264-4735-9b7a-75fd371ef803\n");
 
+       ret = SQLCloseCursor(stmt);
+       check(ret, SQL_HANDLE_STMT, stmt, "SQLCloseCursor");
+
+       /* cleanup */
+       free(outp);
+       return ret;
+}
+
+static SQLRETURN
+testGetDataIntervalDay(SQLHANDLE stmt, int sqlquery)
+{
+       SQLRETURN ret;
+       SQLLEN RowCount = 0;
+       SWORD NumResultCols = 0;
+
+       size_t outp_len = 1800;
+       char * outp = malloc(outp_len);
+       size_t pos = 0;
+
+       char * sql1 = "select cast(NULL as interval day) as valnil, cast('99' 
as interval day) as val1, cast('-99' as interval day) as val2;";
+       char * sql2 = "select cast(NULL as interval day) as valnil, cast('101' 
as interval day) as val1, cast('-102' as interval day) as val2;";        /* 
Interval field overflow */
+       ret = SQLExecDirect(stmt, (sqlquery == 1) ? (SQLCHAR *) sql1 : (SQLCHAR 
*) sql2, SQL_NTS);
+       pos += snprintf(outp + pos, outp_len - pos, "SQLExecDirect query %d\n", 
sqlquery);
+       check(ret, SQL_HANDLE_STMT, stmt, "SQLExecDirect");
+
+       ret = SQLRowCount(stmt, &RowCount);
+       pos += snprintf(outp + pos, outp_len - pos, "SQLRowCount is " LLFMT 
"\n", (int64_t) RowCount);
+       check(ret, SQL_HANDLE_STMT, stmt, "SQLRowCount");
+
+       ret = SQLNumResultCols(stmt, &NumResultCols);
+       pos += snprintf(outp + pos, outp_len - pos, "SQLNumResultCols is %d\n", 
NumResultCols);
+       check(ret, SQL_HANDLE_STMT, stmt, "SQLNumResultCols");
+
+       ret = SQLFetch(stmt);
+       pos += snprintf(outp + pos, outp_len - pos, "SQLFetch\n");
+       check(ret, SQL_HANDLE_STMT, stmt, "SQLFetch");
+
+       for (SWORD col = 1; col <= NumResultCols; col++) {
+               char buf[99];
+               char str_val[42];
+               int int_val;
+               SQL_INTERVAL_STRUCT itv_val;
+               SQLLEN vallen = 0;
+               SQLLEN NumAttr = 0;
+
+               /* retrieve query result column metadata */
+               ret = SQLColAttribute(stmt, (UWORD)col, SQL_DESC_CONCISE_TYPE, 
(PTR)&buf, (SQLLEN)20, NULL, &NumAttr);
+               pos += snprintf(outp + pos, outp_len - pos, 
"SQLColAttribute(%d, SQL_DESC_CONCISE_TYPE) returns %d, NumAttr " LLFMT "\n", 
col, ret, (int64_t) NumAttr);
+               ret = SQLColAttribute(stmt, (UWORD)col, SQL_DESC_DISPLAY_SIZE, 
(PTR)&buf, (SQLLEN)20, NULL, &NumAttr);
+               pos += snprintf(outp + pos, outp_len - pos, 
"SQLColAttribute(%d, SQL_DESC_DISPLAY_SIZE) returns %d, NumAttr " LLFMT "\n", 
col, ret, (int64_t) NumAttr);
+
+               /* test SQLGetData(SQL_C_CHAR) */
+               ret = SQLGetData(stmt, (UWORD)col, (SWORD)SQL_C_CHAR, 
(PTR)&str_val, (SQLLEN)41, &vallen);
+               pos += snprintf(outp + pos, outp_len - pos, "SQLGetData(%d, 
SQL_C_CHAR, 41) returns %d, vallen " LLFMT ", str_val: '%s'\n",
+                       col, ret, (int64_t) vallen, (vallen == SQL_NULL_DATA) ? 
"NULL" : str_val);
+               check(ret, SQL_HANDLE_STMT, stmt, "SQLGetData(col) as str");
+
+               /* test SQLGetData(SQL_C_SLONG) */
+               ret = SQLGetData(stmt, (UWORD)col, (SWORD)SQL_C_SLONG, 
(PTR)&int_val, (SQLLEN)4, &vallen);
+               pos += snprintf(outp + pos, outp_len - pos, "SQLGetData(%d, 
SQL_C_SLONG) returns %d, vallen " LLFMT ", int_val: ", col, ret, (int64_t) 
vallen);
+               if (vallen == SQL_NULL_DATA)
+                       pos += snprintf(outp + pos, outp_len - pos, "NULL\n");
+               else
+                       pos += snprintf(outp + pos, outp_len - pos, "%d\n", 
int_val);
+               check(ret, SQL_HANDLE_STMT, stmt, "SQLGetData(col) as int");    
/* SQLstate 07006 Restricted data type attribute violation */
+
+               /* test SQLGetData(SQL_C_INTERVAL_DAY) */
+               ret = SQLGetData(stmt, (UWORD)col, (SWORD)SQL_C_INTERVAL_DAY, 
(PTR)&itv_val, (SQLLEN)sizeof(SQL_INTERVAL_STRUCT), &vallen);
+               pos += snprintf(outp + pos, outp_len - pos, "SQLGetData(%d, 
SQL_C_INTERVAL_DAY) returns %d, vallen " LLFMT ", itv_day_val: ", col, ret, 
(int64_t) vallen);
+               if (vallen == SQL_NULL_DATA)
+                       pos += snprintf(outp + pos, outp_len - pos, "NULL\n");
+               else
+                       pos += snprintf(outp + pos, outp_len - pos, "%d (type 
%d, sign %d)\n", itv_val.intval.day_second.day, itv_val.interval_type, 
itv_val.interval_sign);
+               check(ret, SQL_HANDLE_STMT, stmt, "SQLGetData(col) as int");
+       }
+
+       compareResult("testGetDataIntervalDay()", outp,
+               (sqlquery == 1)
+               ?       "SQLExecDirect query 1\nSQLRowCount is 
1\nSQLNumResultCols is 3\nSQLFetch\n"
+                       "SQLColAttribute(1, SQL_DESC_CONCISE_TYPE) returns 0, 
NumAttr 103\n"
+                       "SQLColAttribute(1, SQL_DESC_DISPLAY_SIZE) returns 0, 
NumAttr 21\n"
+                       "SQLGetData(1, SQL_C_CHAR, 41) returns 0, vallen -1, 
str_val: 'NULL'\n"
+                       "SQLGetData(1, SQL_C_SLONG) returns 0, vallen -1, 
int_val: NULL\n"
+                       "SQLGetData(1, SQL_C_INTERVAL_DAY) returns 0, vallen 
-1, itv_day_val: NULL\n"
+                       "SQLColAttribute(2, SQL_DESC_CONCISE_TYPE) returns 0, 
NumAttr 103\n"
+                       "SQLColAttribute(2, SQL_DESC_DISPLAY_SIZE) returns 0, 
NumAttr 21\n"
+                       "SQLGetData(2, SQL_C_CHAR, 41) returns 0, vallen 17, 
str_val: 'INTERVAL '99' DAY'\n"
+                       "SQLGetData(2, SQL_C_SLONG) returns 0, vallen 4, 
int_val: 99\n" /* SQLstate 07006 Restricted data type attribute violation */
+                       "SQLGetData(2, SQL_C_INTERVAL_DAY) returns 0, vallen 
28, itv_day_val: 99 (type 3, sign 0)\n"
+                       "SQLColAttribute(3, SQL_DESC_CONCISE_TYPE) returns 0, 
NumAttr 103\n"
+                       "SQLColAttribute(3, SQL_DESC_DISPLAY_SIZE) returns 0, 
NumAttr 21\n"
+                       "SQLGetData(3, SQL_C_CHAR, 41) returns 0, vallen 18, 
str_val: 'INTERVAL -'99' DAY'\n"
+                       "SQLGetData(3, SQL_C_SLONG) returns 0, vallen 4, 
int_val: -99\n"        /* SQLstate 07006 Restricted data type attribute 
violation */
+                       "SQLGetData(3, SQL_C_INTERVAL_DAY) returns 0, vallen 
28, itv_day_val: 99 (type 3, sign 1)\n"
+               :       "SQLExecDirect query 2\nSQLRowCount is 
1\nSQLNumResultCols is 3\nSQLFetch\n"
+                       "SQLColAttribute(1, SQL_DESC_CONCISE_TYPE) returns 0, 
NumAttr 103\n"
+                       "SQLColAttribute(1, SQL_DESC_DISPLAY_SIZE) returns 0, 
NumAttr 21\n"
+                       "SQLGetData(1, SQL_C_CHAR, 41) returns 0, vallen -1, 
str_val: 'NULL'\n"
+                       "SQLGetData(1, SQL_C_SLONG) returns 0, vallen -1, 
int_val: NULL\n"
+                       "SQLGetData(1, SQL_C_INTERVAL_DAY) returns 0, vallen 
-1, itv_day_val: NULL\n"
+                       "SQLColAttribute(2, SQL_DESC_CONCISE_TYPE) returns 0, 
NumAttr 103\n"
+                       "SQLColAttribute(2, SQL_DESC_DISPLAY_SIZE) returns 0, 
NumAttr 21\n"
+                       "SQLGetData(2, SQL_C_CHAR, 41) returns 0, vallen 18, 
str_val: 'INTERVAL '101' DAY'\n"
+                       "SQLGetData(2, SQL_C_SLONG) returns 0, vallen 4, 
int_val: 101\n"        /* SQLstate 07006 Restricted data type attribute 
violation */
+                       "SQLGetData(2, SQL_C_INTERVAL_DAY) returns 0, vallen 
28, itv_day_val: 101 (type 3, sign 0)\n"   /* SQLstate 22015 Interval field 
overflow */
+                       "SQLColAttribute(3, SQL_DESC_CONCISE_TYPE) returns 0, 
NumAttr 103\n"
+                       "SQLColAttribute(3, SQL_DESC_DISPLAY_SIZE) returns 0, 
NumAttr 21\n"
+                       "SQLGetData(3, SQL_C_CHAR, 41) returns 0, vallen 19, 
str_val: 'INTERVAL -'102' DAY'\n"
+                       "SQLGetData(3, SQL_C_SLONG) returns 0, vallen 4, 
int_val: -102\n"       /* SQLstate 07006 Restricted data type attribute 
violation */
+                       "SQLGetData(3, SQL_C_INTERVAL_DAY) returns 0, vallen 
28, itv_day_val: 102 (type 3, sign 1)\n"   /* SQLstate 22015 Interval field 
overflow */
+               );
+
+       ret = SQLCloseCursor(stmt);
+       check(ret, SQL_HANDLE_STMT, stmt, "SQLCloseCursor");
+
        /* cleanup */
        free(outp);
        return ret;
@@ -335,22 +453,22 @@ main(int argc, char **argv)
        ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
        check(ret, SQL_HANDLE_DBC, dbc, "SQLAllocHandle (STMT)");
 
-       /* run tests */
+       /**** run tests ****/
        ret = testGetDataTruncatedString(stmt, SQL_C_CHAR);
        check(ret, SQL_HANDLE_STMT, stmt, "testGetDataTruncatedString(STMT, 
SQL_C_CHAR)");
 
-       ret = SQLCloseCursor(stmt);
-       check(ret, SQL_HANDLE_STMT, stmt, "SQLCloseCursor");
-
        ret = testGetDataTruncatedString(stmt, SQL_C_WCHAR);
        check(ret, SQL_HANDLE_STMT, stmt, "testGetDataTruncatedString(STMT, 
SQL_C_WCHAR)");
 
-       ret = SQLCloseCursor(stmt);
-       check(ret, SQL_HANDLE_STMT, stmt, "SQLCloseCursor");
-
        ret = testGetDataGUID(stmt);
        check(ret, SQL_HANDLE_STMT, stmt, "testGetDataGUID(STMT)");
 
+       ret = testGetDataIntervalDay(stmt, 1);
+       check(ret, SQL_HANDLE_STMT, stmt, "testGetDataIntervalDay(STMT, 99, 
-99)");
+
+       ret = testGetDataIntervalDay(stmt, 2);
+       check(ret, SQL_HANDLE_STMT, stmt, "testGetDataIntervalDay(STMT, 101, 
-102)");
+
        /* cleanup */
        ret = SQLFreeHandle(SQL_HANDLE_STMT, stmt);
        check(ret, SQL_HANDLE_STMT, stmt, "SQLFreeHandle (STMT)");
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to