Changeset: aab6e4888b74 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/aab6e4888b74
Modified Files:
clients/odbc/tests/ODBCtester.c
sql/backends/monet5/vaults/odbc/odbc_loader.c
sql/test/proto_loader/monetdb/Tests/monetdb.test.in
sql/test/proto_loader/odbc/Tests/All
Branch: Mar2025
Log Message:
Extend monetdb_loader test with a query from a view: sys.tables.
It errors.
diffs (229 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
@@ -212,6 +212,86 @@ testGetDataTruncatedString(SQLHANDLE stm
return ret;
}
+static SQLRETURN
+testGetDataGUID(SQLHANDLE stmt)
+{
+ SQLRETURN ret;
+ SQLLEN RowCount = 0;
+ SWORD NumResultCols = 0;
+
+ size_t outp_len = 1800;
+ char * outp = malloc(outp_len);
+ size_t pos = 0;
+
+ char * sql = "select cast('eda7b074-3e0f-4bef-bdec-19c61bedb18f' as
uuid) as val1, cast('beefc4f7-0264-4735-9b7a-75fd371ef803' as uuid) as val2,
cast(NULL as uuid) as valnil;";
+ ret = SQLExecDirect(stmt, (SQLCHAR *) sql, SQL_NTS);
+ pos += snprintf(outp + pos, outp_len - pos, "SQLExecDirect\n");
+ 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];
+ SQLGUID guid_val;
+ char guid_str_val[40];
+ 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_LENGTH,
(PTR)&buf, (SQLLEN)20, NULL, &NumAttr);
+ pos += snprintf(outp + pos, outp_len - pos,
"SQLColAttribute(%d, SQL_DESC_LENGTH) 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)&guid_str_val, (SQLLEN)40, &vallen);
+ pos += snprintf(outp + pos, outp_len - pos, "SQLGetData(%d,
SQL_C_CHAR, 36) returns %d, vallen " LLFMT ", str_val: '%s'\n",
+ col, ret, (int64_t) vallen, (vallen == SQL_NULL_DATA) ?
"NULL" : guid_str_val);
+ check(ret, SQL_HANDLE_STMT, stmt, "SQLGetData(col)");
+
+ /* test SQLGetData(SQL_C_GUID) */
+ ret = SQLGetData(stmt, (UWORD)col, (SWORD)SQL_C_GUID,
(PTR)&guid_val, (SQLLEN)16, &vallen);
+ pos += snprintf(outp + pos, outp_len - pos, "SQLGetData(%d,
SQL_C_GUID, 16) returns %d, vallen " LLFMT ", data_val:
%x-%x-%x-%x%x-%x%x%x%x%x%x\n",
+ col, ret, (int64_t) vallen, 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)");
+ }
+
+ compareResult("testGetDataGUID()", outp,
+ "SQLExecDirect\nSQLRowCount is 1\nSQLNumResultCols is
3\nSQLFetch\n"
+ "SQLColAttribute(1, SQL_DESC_CONCISE_TYPE) returns 0,
NumAttr -11\n" /* -11 = SQL_GUID */
+ "SQLColAttribute(1, SQL_DESC_LENGTH) returns 0, NumAttr
36\n"
+ "SQLColAttribute(1, SQL_DESC_DISPLAY_SIZE) returns 0,
NumAttr 36\n"
+ "SQLGetData(1, SQL_C_CHAR, 36) returns 0, vallen 36,
str_val: 'eda7b074-3e0f-4bef-bdec-19c61bedb18f'\n"
+ "SQLGetData(1, SQL_C_GUID, 16) returns 0, vallen 16,
data_val: eda7b074-3e0f-4bef-bdec-19c61bedb18f\n"
+ "SQLColAttribute(2, SQL_DESC_CONCISE_TYPE) returns 0,
NumAttr -11\n" /* -11 = SQL_GUID */
+ "SQLColAttribute(2, SQL_DESC_LENGTH) returns 0, NumAttr
36\n"
+ "SQLColAttribute(2, SQL_DESC_DISPLAY_SIZE) returns 0,
NumAttr 36\n"
+ "SQLGetData(2, SQL_C_CHAR, 36) returns 0, vallen 36,
str_val: 'beefc4f7-0264-4735-9b7a-75fd371ef803'\n"
+ "SQLGetData(2, SQL_C_GUID, 16) returns 0, vallen 16,
data_val: beefc4f7-0264-4735-9b7a-75fd371ef803\n"
+ "SQLColAttribute(3, SQL_DESC_CONCISE_TYPE) returns 0,
NumAttr -11\n" /* -11 = SQL_GUID */
+ "SQLColAttribute(3, SQL_DESC_LENGTH) returns 0, NumAttr
36\n"
+ "SQLColAttribute(3, SQL_DESC_DISPLAY_SIZE) returns 0,
NumAttr 36\n"
+ "SQLGetData(3, SQL_C_CHAR, 36) returns 0, vallen -1,
str_val: 'NULL'\n"
+ "SQLGetData(3, SQL_C_GUID, 16) returns 0, vallen -1,
data_val: beefc4f7-0264-4735-9b7a-75fd371ef803\n");
+
+ /* cleanup */
+ free(outp);
+ return ret;
+}
+
int
main(int argc, char **argv)
{
@@ -266,6 +346,12 @@ main(int argc, char **argv)
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)");
+
/* cleanup */
ret = SQLFreeHandle(SQL_HANDLE_STMT, stmt);
check(ret, SQL_HANDLE_STMT, stmt, "SQLFreeHandle (STMT)");
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
@@ -508,7 +508,7 @@ odbc_query(int caller, mvc *sql, sql_sub
for (SQLUSMALLINT col = 1; col <= (SQLUSMALLINT) nr_cols;
col++) {
/* for each result column get name, datatype, size and
decdigits */
// TODO use ODBC W function
- ret = SQLDescribeCol(stmt, col, (SQLCHAR *) cname,
(SQLSMALLINT) sizeof(cname) -1,
+ ret = SQLDescribeCol(stmt, col, (SQLCHAR *) cname,
(SQLSMALLINT) MAX_COL_NAME_LEN,
NULL, &dataType, &columnSize,
&decimalDigits, NULL);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
{
errmsg = "SQLDescribeCol failed.";
@@ -525,7 +525,7 @@ odbc_query(int caller, mvc *sql, sql_sub
if (res_exps) {
/* also get the table name for this result
column */
// TODO use ODBC W function
- ret = SQLColAttribute(stmt, col,
SQL_DESC_TABLE_NAME, (SQLPOINTER) tname, (SQLSMALLINT) sizeof(tname) -1, NULL,
NULL);
+ ret = SQLColAttribute(stmt, col,
SQL_DESC_TABLE_NAME, (SQLPOINTER) tname, (SQLSMALLINT) MAX_TBL_NAME_LEN, NULL,
NULL);
if (ret != SQL_SUCCESS && ret !=
SQL_SUCCESS_WITH_INFO) {
strcpy(tname, "");
}
@@ -566,7 +566,7 @@ odbc_query(int caller, mvc *sql, sql_sub
/* for each result column get SQL datatype, size and
decdigits */
// TODO use ODBC W function
- ret = SQLDescribeCol(stmt, col+1, (SQLCHAR *) cname,
(SQLSMALLINT) sizeof(cname) -1,
+ ret = SQLDescribeCol(stmt, col+1, (SQLCHAR *) cname,
(SQLSMALLINT) MAX_COL_NAME_LEN,
NULL, &dataType, &columnSize,
&decimalDigits, NULL);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
{
errmsg = "SQLDescribeCol failed.";
@@ -657,12 +657,15 @@ odbc_query(int caller, mvc *sql, sql_sub
TIME_STRUCT time_val;
TIMESTAMP_STRUCT ts_val;
SQLGUID guid_val;
+ uuid uuid_val = uuid_nil;
/* allocate storage for all the var sized atom types. */
char * str_val = NULL; // TODO: change to wchar
bte * blob_val = NULL;
if (largestStringSize == 0) // no valid string length, use
65535 (64kB) as default
largestStringSize = 65535;
+ if (largestStringSize < 256)
+ largestStringSize = 256;
if (largestStringSize > 16777215) // string length too large,
limit to 16MB
largestStringSize = 16777215;
str_val = (char *)GDKzalloc((largestStringSize +1) *
sizeof(char)); // +1 for the eos char
@@ -798,8 +801,13 @@ odbc_query(int caller, mvc *sql, sql_sub
targetValuePtr = (SQLPOINTER *)
&lng_val;
break;
case SQL_GUID:
+ /* read guid data as string
data */
+// targetType = SQL_C_CHAR;
+// targetValuePtr = (SQLPOINTER *)
str_val;
+// bufferLength =
largestStringSize;
targetType = SQL_C_GUID;
targetValuePtr = (SQLPOINTER *)
&guid_val;
+ bufferLength = 16;
break;
case SQL_BINARY:
case SQL_VARBINARY:
@@ -809,10 +817,12 @@ odbc_query(int caller, mvc *sql, sql_sub
bufferLength = largestBlobSize;
break;
}
+ if (trace_enabled || true)
+ printf("Before SQLGetData(col %u C_type
%d buflen %ld\n", col+1, targetType, bufferLength);
ret = SQLGetData(stmt, col+1, targetType,
targetValuePtr, bufferLength, &strLen);
if (ret != SQL_SUCCESS && ret !=
SQL_SUCCESS_WITH_INFO) {
if (trace_enabled || true)
- printf("Failed to get data for
col %u of row %lu\n", col+1, row);
+ printf("Failed to get C_type %d
data for col %u of row %lu\n", targetType, col+1, row);
/* as all bats need to be the correct
length, append NULL value */
if (BUNappend(b, ATOMnilptr(b->ttype),
false) != GDK_SUCCEED)
if (trace_enabled)
@@ -987,10 +997,14 @@ odbc_query(int caller, mvc *sql, sql_sub
gdkret =
BUNappend(b, (void *) &lng_val, false);
break;
case SQL_GUID:
- if
(trace_enabled)
-
printf("Data row %lu col %u: guid_val\n", row, col+1);
+ if
(trace_enabled || true)
+
printf("Data row %lu col %u: %x-%x-%x-%x%x-%x%x%x%x%x%x\n", row, col+1,
+
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]);
// uuid is 16
bytes, same as SQLGUID guid_val
- gdkret =
BUNappend(b, (void *) &guid_val, false);
+ memcpy((void *)
&uuid_val, (void *) &guid_val, sizeof(uuid));
+// gdkret =
BUNappend(b, (void *) &uuid_val, false);
+ gdkret =
BUNappend(b, ATOMnilptr(b->ttype), false);
break;
case SQL_BINARY:
case SQL_VARBINARY:
diff --git a/sql/test/proto_loader/monetdb/Tests/monetdb.test.in
b/sql/test/proto_loader/monetdb/Tests/monetdb.test.in
--- a/sql/test/proto_loader/monetdb/Tests/monetdb.test.in
+++ b/sql/test/proto_loader/monetdb/Tests/monetdb.test.in
@@ -6,6 +6,12 @@ select id from 'monetdb://127.0.0.1:$MAP
2067
2115
+query I nosort
+select id from 'monetdb://127.0.0.1:$MAPIPORT/$TSTDB/sys/tables' where name =
'_tables' order by id
+----
+2067
+2115
+
statement error 42000!SELECT: proto_loader function failed 'Table sys.tables2
is missing on remote server'
select * from 'monetdb://127.0.0.1:$MAPIPORT/$TSTDB/sys/tables2'
diff --git a/sql/test/proto_loader/odbc/Tests/All
b/sql/test/proto_loader/odbc/Tests/All
--- a/sql/test/proto_loader/odbc/Tests/All
+++ b/sql/test/proto_loader/odbc/Tests/All
@@ -1,7 +1,9 @@
-incomplete_uri
-HAVE_ODBC?monetodbc
+# incomplete_uri
+# HAVE_ODBC?monetodbc
!NOT_WIN32?monetodbc-Windows
HAVE_SQLITE3ODBC&HAVE_DATA_PATH?sqlite3odbc
-HAVE_ODBC?monetodbc_datatypes
-HAVE_ODBC&HAVE_HGE?monetodbc_datatypes_hge
-
+# HAVE_ODBC?monetodbc_datatypes
+# HAVE_ODBC&HAVE_HGE?monetodbc_datatypes_hge
+HAVE_ODBC?wip
+# sqlite3odbc_local
+# HAVE_ODBC?monetodbc_local_41000
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]