Changeset: 1395d225bbe3 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/1395d225bbe3 Modified Files: monetdb5/mal/mal_client.c sql/storage/store.c Branch: sql_profiler Log Message:
Merge with default. diffs (truncated from 2080 to 300 lines): diff --git a/clients/Tests/MAL-signatures-hge.test b/clients/Tests/MAL-signatures-hge.test --- a/clients/Tests/MAL-signatures-hge.test +++ b/clients/Tests/MAL-signatures-hge.test @@ -30533,16 +30533,6 @@ eval pattern batcapi.eval(X_0:ptr, X_1:bit, X_2:str, X_3:any...):any... CUDFevalStd; Execute a simple CUDF script value -batcapi -eval_aggr -pattern batcapi.eval_aggr(X_0:ptr, X_1:bit, X_2:str, X_3:any...):any... -CUDFevalAggr; -grouped aggregates through CUDF -batcapi -subeval_aggr -pattern batcapi.subeval_aggr(X_0:ptr, X_1:bit, X_2:str, X_3:any...):any... -CUDFevalAggr; -grouped aggregates through CUDF batcolor blue command batcolor.blue(X_0:bat[:color]):bat[:int] diff --git a/clients/Tests/MAL-signatures.test b/clients/Tests/MAL-signatures.test --- a/clients/Tests/MAL-signatures.test +++ b/clients/Tests/MAL-signatures.test @@ -21728,16 +21728,6 @@ eval pattern batcapi.eval(X_0:ptr, X_1:bit, X_2:str, X_3:any...):any... CUDFevalStd; Execute a simple CUDF script value -batcapi -eval_aggr -pattern batcapi.eval_aggr(X_0:ptr, X_1:bit, X_2:str, X_3:any...):any... -CUDFevalAggr; -grouped aggregates through CUDF -batcapi -subeval_aggr -pattern batcapi.subeval_aggr(X_0:ptr, X_1:bit, X_2:str, X_3:any...):any... -CUDFevalAggr; -grouped aggregates through CUDF batcolor blue command batcolor.blue(X_0:bat[:color]):bat[:int] diff --git a/clients/odbc/ChangeLog b/clients/odbc/ChangeLog --- a/clients/odbc/ChangeLog +++ b/clients/odbc/ChangeLog @@ -1,6 +1,13 @@ # ChangeLog file for odbc # This file is updated with Maddlog +* Thu Jul 14 2022 Martin van Dinther <[email protected]> +- Removed the possibility to retrieve or set the CURRENT_CATALOG + via SQLGetConnectAttr(hdbc, SQL_ATTR_CURRENT_CATALOG, ...) and + SQLSetConnectAttr(hdbc, SQL_ATTR_CURRENT_CATALOG, ...) as MonetDB does + not support CATALOG objects (no SQL support for: CREATE CATALOG abc + or SET CATALOG abc) and therefore there is no CURRENT_CATALOG. + * Thu Jun 23 2022 Martin van Dinther <[email protected]> - Corrected ODBC functions SQLTablePrivileges() and SQLColumnPrivileges() for local temporary tables located in schema tmp. They did not return diff --git a/clients/odbc/driver/SQLGetConnectAttr.c b/clients/odbc/driver/SQLGetConnectAttr.c --- a/clients/odbc/driver/SQLGetConnectAttr.c +++ b/clients/odbc/driver/SQLGetConnectAttr.c @@ -84,9 +84,16 @@ MNDBGetConnectAttr(ODBCDbc *dbc, break; case SQL_ATTR_CURRENT_CATALOG: /* SQLCHAR* */ /* SQL_CURRENT_QUALIFIER */ - copyString(dbc->dbname, strlen(dbc->dbname), ValuePtr, - BufferLength, StringLengthPtr, SQLINTEGER, - addDbcError, dbc, return SQL_ERROR); + /* MonetDB does NOT support SQL catalog concept, return empty string */ + if (BufferLength <= 0) { + /* Invalid string or buffer length */ + addDbcError(dbc, "HY090", NULL, 0); + return SQL_ERROR; + } + strcpy_len((char *) ValuePtr, "", BufferLength); + if (StringLengthPtr) { + *(StringLengthPtr) = (SQLINTEGER) 0; + } break; case SQL_ATTR_TXN_ISOLATION: /* SQLUINTEGER */ /* SQL_TXN_ISOLATION */ diff --git a/clients/odbc/driver/SQLGetTypeInfo.c b/clients/odbc/driver/SQLGetTypeInfo.c --- a/clients/odbc/driver/SQLGetTypeInfo.c +++ b/clients/odbc/driver/SQLGetTypeInfo.c @@ -1033,7 +1033,7 @@ MNDBGetTypeInfo(ODBCStmt *stmt, { const struct types *t; int i; - char query[4096]; + char query[4352]; switch (DataType) { case SQL_ALL_TYPES: @@ -1220,29 +1220,30 @@ MNDBGetTypeInfo(ODBCStmt *stmt, } } i += snprintf(query+ i, sizeof(query) - i, ") as monetdb_types " - "(type_name" - ",data_type" - ",column_size" - ",literal_prefix" - ",literal_suffix" - ",create_params" - ",nullable" - ",case_sensitive" - ",searchable" - ",unsigned_attribute" - ",fixed_prec_scale" - ",auto_unique_value" - ",local_type_name" - ",minimum_scale" - ",maximum_scale" - ",sql_data_type" - ",sql_datetime_sub" - ",num_prec_radix" - ",interval_precision)"); + "(\"TYPE_NAME\"" + ",\"DATA_TYPE\"" + ",\"COLUMN_SIZE\"" + ",\"LITERAL_PREFIX\"" + ",\"LITERAL_SUFFIX\"" + ",\"CREATE_PARAMS\"" + ",\"NULLABLE\"" + ",\"CASE_SENSITIVE\"" + ",\"SEARCHABLE\"" + ",\"UNSIGNED_ATTRIBUTE\"" + ",\"FIXED_PREC_SCALE\"" + ",\"AUTO_UNIQUE_VALUE\"" + ",\"LOCAL_TYPE_NAME\"" + ",\"MINIMUM_SCALE\"" + ",\"MAXIMUM_SCALE\"" + ",\"SQL_DATA_TYPE\"" + ",\"SQL_DATETIME_SUB\"" + ",\"NUM_PREC_RADIX\"" + ",\"INTERVAL_PRECISION\")"); assert(i < (int) sizeof(query)); - return MNDBExecDirect(stmt, (SQLCHAR *) query, - (SQLINTEGER) i); + /* debug: fprintf(stdout, "SQLGetTypeInfo query (pos: %d, len: %zu):\n%s\n\n", i, strlen(query), query); */ + + return MNDBExecDirect(stmt, (SQLCHAR *) query, (SQLINTEGER) i); } #ifdef ODBCDEBUG diff --git a/clients/odbc/driver/SQLSetConnectAttr.c b/clients/odbc/driver/SQLSetConnectAttr.c --- a/clients/odbc/driver/SQLSetConnectAttr.c +++ b/clients/odbc/driver/SQLSetConnectAttr.c @@ -58,22 +58,9 @@ MNDBSetConnectAttr(ODBCDbc *dbc, } return SQL_SUCCESS; case SQL_ATTR_CURRENT_CATALOG: /* SQLCHAR* */ - fixODBCstring(ValuePtr, StringLength, SQLINTEGER, - addDbcError, dbc, return SQL_ERROR); - if (dbc->Connected) { - /* Driver does not support this functions */ - addDbcError(dbc, "IM001", NULL, 0); - return SQL_ERROR; - } - if (dbc->dbname) - free(dbc->dbname); - dbc->dbname = dupODBCstring(ValuePtr, StringLength); - if (dbc->dbname == NULL) { - /* Memory allocation error */ - addDbcError(dbc, "HY001", NULL, 0); - return SQL_ERROR; - } - break; + /* Driver does not support this function */ + addDbcError(dbc, "IM001", NULL, 0); + return SQL_ERROR; case SQL_ATTR_CONNECTION_TIMEOUT: /* SQLUINTEGER */ dbc->sql_attr_connection_timeout = (SQLUINTEGER) (uintptr_t) ValuePtr; if (dbc->mid) diff --git a/clients/odbc/tests/ODBCmetadata.c b/clients/odbc/tests/ODBCmetadata.c --- a/clients/odbc/tests/ODBCmetadata.c +++ b/clients/odbc/tests/ODBCmetadata.c @@ -18,6 +18,7 @@ * SQLColumnPrivileges() * SQLProcedures() * SQLProcedureColumns() + * SQLGetTypeInfo() */ #ifdef _MSC_VER @@ -30,10 +31,14 @@ #include <stdio.h> #include <stdlib.h> #include <stdint.h> +#include <inttypes.h> +#define ODBCVER 0x0352 /* Important: this must be defined before include of sql.h and sqlext.h */ #include <sql.h> #include <sqlext.h> #include <string.h> +#define SQL_HUGEINT 0x4000 /* as defined in ODBCGlobal.h */ + static void prerr(SQLSMALLINT tpe, SQLHANDLE hnd, const char *func, const char *pref) { @@ -89,6 +94,53 @@ check(SQLRETURN ret, SQLSMALLINT tpe, SQ } } +static char * +nameofSQLtype(SQLSMALLINT dataType) +{ + /* https://docs.microsoft.com/en-us/sql/odbc/reference/appendixes/sql-data-types */ + switch (dataType) { + case SQL_CHAR: return "CHAR"; + case SQL_VARCHAR: return "VARCHAR"; + case SQL_LONGVARCHAR: return "LONG VARCHAR"; + case SQL_WCHAR: return "WCHAR"; + case SQL_WVARCHAR: return "WVARCHAR"; + case SQL_WLONGVARCHAR: return "WLONGVARCHAR"; + case SQL_DECIMAL: return "DECIMAL"; + case SQL_NUMERIC: return "NUMERIC"; + case SQL_SMALLINT: return "SMALLINT"; + case SQL_INTEGER: return "INTEGER"; + case SQL_REAL: return "REAL"; + case SQL_FLOAT: return "FLOAT"; + case SQL_DOUBLE: return "DOUBLE"; + case SQL_BIT: return "BOOLEAN"; /* MonetDB boolean type is mapped to SQL_BIT in ODBC (see msql_types[] in SQLExecute.c) */ + case SQL_TINYINT: return "TINYINT"; + case SQL_BIGINT: return "BIGINT"; + case SQL_BINARY: return "BINARY"; + case SQL_VARBINARY: return "VARBINARY"; + case SQL_LONGVARBINARY: return "LONG VARBINARY"; + case SQL_DATETIME: return "DATETIME"; + case SQL_TYPE_DATE: return "DATE"; + case SQL_TYPE_TIME: return "TIME"; + case SQL_TYPE_TIMESTAMP: return "TIMESTAMP"; + case SQL_INTERVAL_MONTH: return "INTERVAL MONTH"; + case SQL_INTERVAL_YEAR: return "INTERVAL YEAR"; + case SQL_INTERVAL_YEAR_TO_MONTH: return "INTERVAL YEAR TO MONTH"; + case SQL_INTERVAL_DAY: return "INTERVAL DAY"; + case SQL_INTERVAL_HOUR: return "INTERVAL HOUR"; + case SQL_INTERVAL_MINUTE: return "INTERVAL MINUTE"; + case SQL_INTERVAL_SECOND: return "INTERVAL SECOND"; + case SQL_INTERVAL_DAY_TO_HOUR: return "INTERVAL DAY TO HOUR"; + case SQL_INTERVAL_DAY_TO_MINUTE: return "INTERVAL DAY TO MINUTE"; + case SQL_INTERVAL_DAY_TO_SECOND: return "INTERVAL DAY TO SECOND"; + case SQL_INTERVAL_HOUR_TO_MINUTE: return "INTERVAL HOUR TO MINUTE"; + case SQL_INTERVAL_HOUR_TO_SECOND: return "INTERVAL HOUR TO SECOND"; + case SQL_INTERVAL_MINUTE_TO_SECOND: return "INTERVAL MINUTE TO SECOND"; + case SQL_GUID: return "GUID"; + case SQL_HUGEINT: return "HUGEINT"; /* 0x4000 (defined in ODBCGlobal.h) */ + default: return "Undefined"; + } +} + static void compareResult(SQLHANDLE stmt, SQLRETURN retcode, const char * functionname, const char * expected) { @@ -102,6 +154,9 @@ compareResult(SQLHANDLE stmt, SQLRETURN SQLUSMALLINT col; SQLLEN indicator; char buf[2048]; + SQLSMALLINT dataType = 0; + SQLULEN columnSize = 0; + SQLSMALLINT decimalDigits = 0; int replaceId = 0; /* used to replace system id values in column SPECIFIC_NAME of getProcedures and getProcedureColumns */ if (outp == NULL) { @@ -119,17 +174,49 @@ compareResult(SQLHANDLE stmt, SQLRETURN /* How many rows are there */ ret = SQLRowCount(stmt, &rows); check(ret, SQL_HANDLE_STMT, stmt, "SQLRowCount()"); - pos += snprintf(outp + pos, outp_len - pos, "Resultset with %ld rows\n", rows); + pos += snprintf(outp + pos, outp_len - pos, "Resultset with %"PRId64" rows\n", (int64_t) rows); /* get Result Column Names and print them */ for (col = 1; col <= columns; col++) { ret = SQLDescribeCol(stmt, col, (SQLCHAR *) buf, sizeof(buf), NULL, NULL, NULL, NULL, NULL); - check(ret, SQL_HANDLE_STMT, stmt, "SQLDescribeCol()"); + check(ret, SQL_HANDLE_STMT, stmt, "SQLDescribeCol(colName)"); pos += snprintf(outp + pos, outp_len - pos, (col > 1) ? "\t%s" : "%s", buf); } pos += snprintf(outp + pos, outp_len - pos, "\n"); + /* get Result Column Data Types and print them */ + for (col = 1; col <= columns; col++) { + ret = SQLDescribeCol(stmt, col, (SQLCHAR *) buf, sizeof(buf), + NULL, &dataType, &columnSize, &decimalDigits, NULL); + check(ret, SQL_HANDLE_STMT, stmt, "SQLDescribeCol(colType)"); + pos += snprintf(outp + pos, outp_len - pos, + (col > 1) ? "\t%s" : "%s", nameofSQLtype(dataType)); + switch (dataType) { + case SQL_CHAR: + case SQL_VARCHAR: + case SQL_LONGVARCHAR: + case SQL_WCHAR: + case SQL_WVARCHAR: + case SQL_WLONGVARCHAR: + case SQL_DECIMAL: + case SQL_NUMERIC: + case SQL_BINARY: + case SQL_VARBINARY: + case SQL_LONGVARBINARY: + if (columnSize != 0) { _______________________________________________ checkin-list mailing list -- [email protected] To unsubscribe send an email to [email protected]
