MonetDB: default - Don't shadow variable.
Changeset: b175905caa97 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/b175905caa97 Modified Files: sql/backends/monet5/generator/generator.c Branch: default Log Message: Don't shadow variable. diffs (12 lines): diff --git a/sql/backends/monet5/generator/generator.c b/sql/backends/monet5/generator/generator.c --- a/sql/backends/monet5/generator/generator.c +++ b/sql/backends/monet5/generator/generator.c @@ -176,7 +176,7 @@ VLTgenerator_noop(Client cntxt, MalBlkPt if (s == 0 || (s > 0 && f > l) || (s < 0 && f < l) || is_##TPE##_nil(f) || is_##TPE##_nil(l)) \ throw(MAL, "generator.table", \ SQLSTATE(42000) "Illegal generator range"); \ - BUN n = (BUN) ((l - f) / s); \ + n = (BUN) ((l - f) / s); \ if ((TPE) (n * s + f) != l) \ n++; \ bn = COLnew(0, TYPE_##TPE, n, TRANSIENT); \ ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: default - Don't make output BAT too large.
Changeset: c6b24bb1671a for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/c6b24bb1671a Modified Files: sql/backends/monet5/generator/generator.c Branch: default Log Message: Don't make output BAT too large. diffs (39 lines): diff --git a/sql/backends/monet5/generator/generator.c b/sql/backends/monet5/generator/generator.c --- a/sql/backends/monet5/generator/generator.c +++ b/sql/backends/monet5/generator/generator.c @@ -248,7 +248,8 @@ VLTgenerator_table_(BAT **result, Client if (bn == NULL) throw(MAL, "generator.table", SQLSTATE(HY013) MAL_MALLOC_FAIL); v = (date *) Tloc(bn, 0); - for (BUN c = 0; c < n && f < l; c++) { + BUN c; + for (c = 0; c < n && f < l; c++) { *v++ = f; f = date_add_month(f, s); if (is_date_nil(f)) { @@ -256,6 +257,7 @@ VLTgenerator_table_(BAT **result, Client throw(MAL, "generator.table", SQLSTATE(22003) "overflow in calculation"); } } + n = c; bn->tsorted = s > 0 || n <= 1; bn->trevsorted = s < 0 || n <= 1; } else if (tpe == TYPE_date) { /* days */ @@ -282,7 +284,8 @@ VLTgenerator_table_(BAT **result, Client if (bn == NULL) throw(MAL, "generator.table", SQLSTATE(HY013) MAL_MALLOC_FAIL); v = (date *) Tloc(bn, 0); - for (BUN c = 0; c < n && f < l; c++) { + BUN c; + for (c = 0; c < n && f < l; c++) { *v++ = f; f = date_add_day(f, (int) s); if (is_date_nil(f)) { @@ -290,6 +293,7 @@ VLTgenerator_table_(BAT **result, Client throw(MAL, "generator.table", SQLSTATE(22003) "overflow in calculation"); } } + n = c; bn->tsorted = s > 0 || n <= 1; bn->trevsorted = s < 0 || n <= 1; } else if (tpe == TYPE_timestamp) { ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: default - Approve tests.
Changeset: d5c6125facb1 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/d5c6125facb1 Modified Files: sql/backends/monet5/generator/Tests/generator03.test Branch: default Log Message: Approve tests. diffs (27 lines): diff --git a/sql/backends/monet5/generator/Tests/generator03.test b/sql/backends/monet5/generator/Tests/generator03.test --- a/sql/backends/monet5/generator/Tests/generator03.test +++ b/sql/backends/monet5/generator/Tests/generator03.test @@ -22,6 +22,7 @@ 2008-03-02 16:00:00 2008-03-03 02:00:00 2008-03-03 12:00:00 2008-03-03 22:00:00 +2008-03-04 08:00:00 query T rowsort select * from generate_series( @@ -32,6 +33,7 @@ select * from generate_series( 2008-03-01 00:00:00 2008-03-02 00:00:00 2008-03-03 00:00:00 +2008-03-04 00:00:00 query T rowsort select * from generate_series( @@ -39,6 +41,7 @@ select * from generate_series( timestamp '2008-03-01 00:00', cast( '-1' as interval day)) +2008-03-01 12:00:00 2008-03-02 12:00:00 2008-03-03 12:00:00 2008-03-04 12:00:00 ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: odbc-tls - Add a test program for SQLBrowseConnect
Changeset: 367d65788e89 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/367d65788e89 Added Files: clients/odbc/samples/odbcbrowse.c Modified Files: clients/odbc/samples/CMakeLists.txt Branch: odbc-tls Log Message: Add a test program for SQLBrowseConnect diffs (168 lines): diff --git a/clients/odbc/samples/CMakeLists.txt b/clients/odbc/samples/CMakeLists.txt --- a/clients/odbc/samples/CMakeLists.txt +++ b/clients/odbc/samples/CMakeLists.txt @@ -26,9 +26,17 @@ target_link_libraries(arraytest PRIVATE ODBC::ODBC) +add_executable(odbcbrowse + odbcbrowse.c) + +target_link_libraries(odbcbrowse + PRIVATE + ODBC::ODBC) + install(TARGETS odbcsample1 arraytest + odbcbrowse RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} @@ -38,6 +46,7 @@ if(WIN32) install(FILES $ $ +$ DESTINATION ${CMAKE_INSTALL_BINDIR} OPTIONAL) endif() diff --git a/clients/odbc/samples/odbcbrowse.c b/clients/odbc/samples/odbcbrowse.c new file mode 100644 --- /dev/null +++ b/clients/odbc/samples/odbcbrowse.c @@ -0,0 +1,134 @@ +/* + * SPDX-License-Identifier: MPL-2.0 + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2024 MonetDB Foundation; + * Copyright August 2008 - 2023 MonetDB B.V.; + * Copyright 1997 - July 2008 CWI. + */ +#include +#include +#include +#include +#include +#include + +// borrowed from odbcsample1 +static void +prerr(SQLSMALLINT tpe, SQLHANDLE hnd, const char *func, const char *pref) +{ + SQLCHAR state[6]; + SQLINTEGER errnr; + SQLCHAR msg[256]; + SQLSMALLINT msglen; + + switch (SQLGetDiagRec(tpe, hnd, 1, state, &errnr, msg, sizeof(msg), &msglen)) { + case SQL_SUCCESS_WITH_INFO: + if (msglen >= (signed int) sizeof(msg)) + fprintf(stderr, "(message truncated)\n"); + /* fall through */ + case SQL_SUCCESS: + fprintf(stderr, "%s: %s: SQLstate %s, Errnr %d, Message %s\n", func, pref, (char*)state, (int)errnr, (char*)msg); + break; + case SQL_INVALID_HANDLE: + fprintf(stderr, "%s: %s, invalid handle passed to error function\n", func, pref); + break; + case SQL_ERROR: + fprintf(stderr, "%s: %s, unexpected error from SQLGetDiagRec\n", func, pref); + break; + case SQL_NO_DATA: + break; + default: + fprintf(stderr, "%s: %s, weird return value from SQLGetDiagRec\n", func, pref); + break; + } +} + +// borrowed from odbcsample1, with changes. +// return 0 on success, proper exit code on error. +static int +check(SQLRETURN ret, SQLSMALLINT tpe, SQLHANDLE hnd, const char *func) +{ + switch (ret) { + case SQL_SUCCESS: + return 0; + case SQL_SUCCESS_WITH_INFO: + prerr(tpe, hnd, func, "Info"); + return 0; + case SQL_ERROR: + prerr(tpe, hnd, func, "Error"); + return 1; + case SQL_INVALID_HANDLE: + fprintf(stderr, "%s: Error: invalid handle\n", func); + return 1; + default: + fprintf(stderr, "%s: Unexpected return value: %d\n", func, ret); + return 1; + } +} + +int +main(int argc, char **argv) +{ + int exit_code; + SQLRETURN ret; + SQLHANDLE env; + SQLHANDLE conn; + char *connection_string; + SQLCHAR prompt[1024]; + SQLSMALLINT prompt_size = (SQLSMALLINT) sizeof(prompt); + SQLSMALLINT required_size; + + if (argc != 2) { + fprintf(stderr, "Usage: odbcbrowse CONNECTSTRING\n"); + fprintf(stderr, "Exit code: 2 = need more data, 1 = other error\n"); + exit_code = 1; + goto end; + } + connection_string = argv[1]; + + // Prepare + + ret = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &env); + exit_code = check(ret, SQL_HANDLE_ENV, NULL, "SQLAllocHandle ENV"); + if (exit_code) + goto end; + + ret = SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, 0); + exit_code = check(ret, SQL_HANDLE_ENV, env, "SQLSetEnvAttr SQL_ATTR_ODBC_VERSION"); + if (exit_code) + goto end; + + ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &conn); + exit_code = check(ret, SQL_HANDLE_DBC, env, "SQLAllocHandle DBC"); + if (exit_code) + goto end; + + // We have a connection handle, let's browse + + ret = SQLBrowseConnectA(conn, (SQLCHAR*)connection_string, SQL_NTS, prompt, prompt_size, &required_size); + if (ret == SQL_NEED_DATA) { + if (required_size > prompt_size - 1) { + fprintf(stderr, "Please ask a wizard to enlarge me"); +
MonetDB: odbc-tls - Turn ODBCLOG into a static inline function
Changeset: 46ca0cf07d2e for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/46ca0cf07d2e Modified Files: clients/odbc/driver/ODBCGlobal.h clients/odbc/driver/ODBCUtil.c Branch: odbc-tls Log Message: Turn ODBCLOG into a static inline function Rather than a macro if C99 and a regular function otherwise. diffs (133 lines): diff --git a/clients/odbc/driver/ODBCGlobal.h b/clients/odbc/driver/ODBCGlobal.h --- a/clients/odbc/driver/ODBCGlobal.h +++ b/clients/odbc/driver/ODBCGlobal.h @@ -101,50 +101,45 @@ extern const wchar_t *ODBCdebug; extern const char *ODBCdebug; #endif -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901 +static inline void ODBCLOG(_In_z_ _Printf_format_string_ const char *fmt, ...) + __attribute__((__format__(__printf__, 1, 2))); + +static inline void +ODBCLOG(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + if (ODBCdebug == NULL) { #ifdef NATIVE_WIN32 -#define ODBCLOG(...) \ - do {\ - if (ODBCdebug == NULL) {\ - if ((ODBCdebug = _wgetenv(L"ODBCDEBUG")) == NULL) \ - ODBCdebug = _wcsdup(L""); \ - else\ - ODBCdebug = _wcsdup(ODBCdebug); \ - } \ - if (ODBCdebug != NULL && *ODBCdebug != 0) { \ - FILE *_f; \ - _f = _wfopen(ODBCdebug, L"a"); \ - if (_f == NULL) \ - _f = stderr;\ - fprintf(_f, __VA_ARGS__); \ - if (_f != stderr) \ - fclose(_f); \ - } \ - } while (0) + if ((ODBCdebug = _wgetenv(L"ODBCDEBUG")) == NULL) + ODBCdebug = _wcsdup(L""); + else + ODBCdebug = _wcsdup(ODBCdebug); #else -#define ODBCLOG(...) \ - do {\ - if (ODBCdebug == NULL) {\ - if ((ODBCdebug = getenv("ODBCDEBUG")) == NULL) \ - ODBCdebug = strdup(""); \ - else\ - ODBCdebug = strdup(ODBCdebug); \ - } \ - if (ODBCdebug != NULL && *ODBCdebug != 0) { \ - FILE *_f; \ - _f = fopen(ODBCdebug, "a"); \ - if (_f == NULL) \ - _f = stderr;\ - fprintf(_f, __VA_ARGS__); \ - if (_f != stderr) \ - fclose(_f); \ - } \ - } while (0) + if ((ODBCdebug = getenv("ODBCDEBUG")) == NULL) + ODBCdebug = strdup(""); + else + ODBCdebug = strdup(ODBCdebug); #endif + } + if (ODBCdebug != NULL && *ODBCdebug != 0) { + FILE *f; + +#ifdef NATIVE_WIN32 + f = _wfopen(ODBCdebug, L"a"); #else -extern void ODBCLOG(_In_z_ _Printf_format_string_ const char *fmt, ...) - __attribute__((__format__(__printf__, 1, 2))); + f = fopen(ODBCdebug, "a"); #endif + if (f) { + vfprintf(f, fmt, ap); + fclose(f); + } else + vfprintf(stderr, fmt, ap); + } + va_end(ap); +} + char *translateCType(SQLSMALLINT ValueType); char *translateSQLType(SQLSMALLINT ParameterType); diff --git a/clients/odbc/driver/ODBCUtil.c b/clients/odbc/driver/ODBCUtil.c --- a/clients/odbc/driver/ODBCUtil.c +++ b/clients/odbc/driver/ODBCUtil.c @@ -2624,41 +2624,5 @@ translateCompletionType(SQLSMALLINT Comp } } -#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901 -void -ODBCLOG(const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - if (ODBCdebug == NULL) { -#ifdef NATIVE_WIN3
MonetDB: odbc-tls - Introduce setODBCdebug to simplify code
Changeset: 766abae9a64a for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/766abae9a64a Modified Files: clients/odbc/driver/ODBCGlobal.h clients/odbc/driver/ODBCUtil.c clients/odbc/driver/SQLBrowseConnect.c clients/odbc/driver/SQLConnect.c clients/odbc/driver/SQLDriverConnect.c Branch: odbc-tls Log Message: Introduce setODBCdebug to simplify code diffs (210 lines): diff --git a/clients/odbc/driver/ODBCGlobal.h b/clients/odbc/driver/ODBCGlobal.h --- a/clients/odbc/driver/ODBCGlobal.h +++ b/clients/odbc/driver/ODBCGlobal.h @@ -101,6 +101,8 @@ extern const wchar_t *ODBCdebug; extern const char *ODBCdebug; #endif +extern void setODBCdebug(const char *filename, bool overrideEnvVar); + static inline void ODBCLOG(_In_z_ _Printf_format_string_ const char *fmt, ...) __attribute__((__format__(__printf__, 1, 2))); diff --git a/clients/odbc/driver/ODBCUtil.c b/clients/odbc/driver/ODBCUtil.c --- a/clients/odbc/driver/ODBCUtil.c +++ b/clients/odbc/driver/ODBCUtil.c @@ -2624,5 +2624,38 @@ translateCompletionType(SQLSMALLINT Comp } } +void +setODBCdebug(const char *filename, bool overrideEnvVar) +{ + if (!overrideEnvVar) { +#ifdef NATIVE_WIN32 + void *value = _wgetenv(L"ODBCDEBUG"); +#else + void *value = getenv("ODBCDEBUG"); +#endif + if (value != NULL) + return;// do not override + } + + free((void*)ODBCdebug); + +#ifdef NATIVE_WIN32 + size_t attrlen = strlen(filename); + SQLWCHAR *wattr = malloc((attrlen + 1) * sizeof(SQLWCHAR)); + if (ODBCutf82wchar(filename, + (SQLINTEGER) attrlen, + wattr, + (SQLLEN) ((attrlen + 1) * sizeof(SQLWCHAR)), + NULL, + NULL)) { + free(wattr); + wattr = NULL; + } + ODBCdebug = wattr; +#else + ODBCdebug = strdup(filename); +#endif +} + #endif diff --git a/clients/odbc/driver/SQLBrowseConnect.c b/clients/odbc/driver/SQLBrowseConnect.c --- a/clients/odbc/driver/SQLBrowseConnect.c +++ b/clients/odbc/driver/SQLBrowseConnect.c @@ -61,7 +61,7 @@ MNDBBrowseConnect(ODBCDbc *dbc, int n; SQLRETURN rc; #ifdef ODBCDEBUG - bool allocated = false; + bool odbcdebug_changed = false; #endif fixODBCstring(InConnectionString, StringLength1, SQLSMALLINT, addDbcError, dbc, return SQL_ERROR); @@ -113,34 +113,10 @@ MNDBBrowseConnect(ODBCDbc *dbc, mapToLongVarchar = atoi(attr); free(attr); #ifdef ODBCDEBUG - } else if (strcasecmp(key, "logfile") == 0 && -#ifdef NATIVE_WIN32 - _wgetenv(L"ODBCDEBUG") -#else - getenv("ODBCDEBUG") -#endif - == NULL) { - /* environment trumps everything */ - if (ODBCdebug) - free((void *) ODBCdebug); /* discard const */ -#ifdef NATIVE_WIN32 - size_t attrlen = strlen(attr); - SQLWCHAR *wattr = malloc((attrlen + 1) * sizeof(SQLWCHAR)); - if (ODBCutf82wchar(attr, - (SQLINTEGER) attrlen, - wattr, - (SQLLEN) ((attrlen + 1) * sizeof(SQLWCHAR)), - NULL, - NULL)) { - free(wattr); - wattr = NULL; - } - ODBCdebug = wattr; + } else if (strcasecmp(key, "logfile") == 0) { + setODBCdebug(attr, false); free(attr); -#else - ODBCdebug = attr; -#endif - allocated = true; + odbcdebug_changed = true; #endif } else free(attr); @@ -189,35 +165,12 @@ MNDBBrowseConnect(ODBCDbc *dbc, } } #ifdef ODBCDEBUG - if (!allocated && -#ifdef NATIVE_WIN32 - _wgetenv(L"ODBCDEBUG") -#else - getenv("ODBCDEBUG") -#endif - == NULL) { + if (!odbcdebug_changed) { /* if not set from InConnectionString argument * or environment, look in profile */ n = SQLGetPrivateProfileString(dsn, "logfile", "", buf, sizeof(buf), "odbc.ini"); if (n > 0 && buf[0]) { - if (ODBCdebug) - free((void *) ODBCdebug); /* discard const */ -#ifdef NATIVE_WIN32 - size_t attrlen = strlen(buf
MonetDB: odbc-tls - unix_sock_name_buffer can be NULL
Changeset: 61eea1cb05bb for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/61eea1cb05bb Modified Files: clients/mapilib/msettings.c Branch: odbc-tls Log Message: unix_sock_name_buffer can be NULL diffs (15 lines): diff --git a/clients/mapilib/msettings.c b/clients/mapilib/msettings.c --- a/clients/mapilib/msettings.c +++ b/clients/mapilib/msettings.c @@ -261,8 +261,9 @@ msettings *msettings_clone(const msettin { msettings *mp = malloc(sizeof(*mp)); char **unknowns = calloc(2 * orig->nr_unknown, sizeof(char*)); - char *cloned_name_buffer = strdup(orig->unix_sock_name_buffer); - if (!mp || !unknowns || !cloned_name_buffer) { + const char *namebuf = orig->unix_sock_name_buffer; + char *cloned_name_buffer = namebuf ? strdup(namebuf) : NULL; + if (!mp || !unknowns || (namebuf && !cloned_name_buffer)) { free(mp); free(unknowns); free(cloned_name_buffer); ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: odbc-tls - Add MP_LOGFILE setting
Changeset: 0f2ff32819ca for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/0f2ff32819ca Modified Files: clients/mapilib/msettings.c clients/mapilib/msettings.h Branch: odbc-tls Log Message: Add MP_LOGFILE setting diffs (42 lines): diff --git a/clients/mapilib/msettings.c b/clients/mapilib/msettings.c --- a/clients/mapilib/msettings.c +++ b/clients/mapilib/msettings.c @@ -102,9 +102,10 @@ by_name[] = { { .name="tls", .parm=MP_TLS }, { .name="user", .parm=MP_USER }, // + { .name="logfile", .parm=MP_LOGFILE }, + // { .name="hash", .parm=MP_IGNORE }, { .name="debug", .parm=MP_IGNORE }, - { .name="logfile", .parm=MP_IGNORE }, }; mparm @@ -141,6 +142,7 @@ mparm_name(mparm parm) case MP_DATABASE: return "database"; case MP_HOST: return "host"; case MP_LANGUAGE: return "language"; + case MP_LOGFILE: return "logfile"; case MP_PASSWORD: return "password"; case MP_PORT: return "port"; case MP_REPLYSIZE: return "replysize"; @@ -208,6 +210,7 @@ struct msettings { struct string language; struct string schema; struct string binary; + struct string logfile; struct string dummy_end_string; char **unknown_parameters; diff --git a/clients/mapilib/msettings.h b/clients/mapilib/msettings.h --- a/clients/mapilib/msettings.h +++ b/clients/mapilib/msettings.h @@ -69,6 +69,7 @@ typedef enum mparm { MP_LANGUAGE, MP_SCHEMA, // TODO implement this MP_BINARY, + MP_LOGFILE, } mparm; typedef enum mparm_class { ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: odbc-tls - Add MP_MAPTOLONGVARCHAR to msettings
Changeset: 889713b0de8b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/889713b0de8b Modified Files: clients/mapilib/msettings.c clients/mapilib/msettings.h Branch: odbc-tls Log Message: Add MP_MAPTOLONGVARCHAR to msettings diffs (38 lines): diff --git a/clients/mapilib/msettings.c b/clients/mapilib/msettings.c --- a/clients/mapilib/msettings.c +++ b/clients/mapilib/msettings.c @@ -89,6 +89,7 @@ by_name[] = { { .name="database", .parm=MP_DATABASE }, { .name="host", .parm=MP_HOST }, { .name="language", .parm=MP_LANGUAGE }, + { .name="map_to_long_varchar", .parm=MP_MAPTOLONGVARCHAR }, { .name="password", .parm=MP_PASSWORD }, { .name="port", .parm=MP_PORT }, { .name="replysize", .parm=MP_REPLYSIZE }, @@ -143,6 +144,7 @@ mparm_name(mparm parm) case MP_HOST: return "host"; case MP_LANGUAGE: return "language"; case MP_LOGFILE: return "logfile"; + case MP_MAPTOLONGVARCHAR: return "map_to_long_varchar"; case MP_PASSWORD: return "password"; case MP_PORT: return "port"; case MP_REPLYSIZE: return "replysize"; @@ -191,6 +193,7 @@ struct msettings { long port; long timezone; long replysize; + long map_to_long_varchar; long dummy_end_long; // Must match EXACTLY the order of enum mparm diff --git a/clients/mapilib/msettings.h b/clients/mapilib/msettings.h --- a/clients/mapilib/msettings.h +++ b/clients/mapilib/msettings.h @@ -52,6 +52,7 @@ typedef enum mparm { MP_PORT = MP__LONG_START, MP_TIMEZONE, MP_REPLYSIZE, + MP_MAPTOLONGVARCHAR, // specific to ODBC // string MP_SOCK = MP__STRING_START, ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: odbc-tls - Move all odbc parameters into msettings
Changeset: bab82f70e0ca for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/bab82f70e0ca Added Files: clients/odbc/driver/ODBCAttrs.h Modified Files: clients/odbc/driver/CMakeLists.txt clients/odbc/driver/ODBCDbc.c clients/odbc/driver/ODBCDbc.h clients/odbc/driver/SQLConnect.c Branch: odbc-tls Log Message: Move all odbc parameters into msettings Currently, uid, password, database, host, port, etc., all get passed around and processed separately. Now that we have lots of extra TLS parameters, plus schema, time zone, etc, this is no longer sustainable. This is a huge delta but I couldn't find a way to split it., diffs (truncated from 661 to 300 lines): diff --git a/clients/odbc/driver/CMakeLists.txt b/clients/odbc/driver/CMakeLists.txt --- a/clients/odbc/driver/CMakeLists.txt +++ b/clients/odbc/driver/CMakeLists.txt @@ -19,6 +19,7 @@ add_library(MonetODBC target_sources(MonetODBC PRIVATE + ODBCAttrs.h ODBCConvert.c ODBCDbc.c ODBCDbc.h diff --git a/clients/odbc/driver/ODBCAttrs.h b/clients/odbc/driver/ODBCAttrs.h new file mode 100644 --- /dev/null +++ b/clients/odbc/driver/ODBCAttrs.h @@ -0,0 +1,39 @@ +/* + * SPDX-License-Identifier: MPL-2.0 + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2024 MonetDB Foundation; + * Copyright August 2008 - 2023 MonetDB B.V.; + * Copyright 1997 - July 2008 CWI. + */ + +/* + * Provide a mapping between attribute names as found in data sources and + * connection strings. +*/ + +#ifndef ODBCATTRS +#define ODBCATTRS + +#include "msettings.h" + +struct attr_setting { + const char *name;// canonical attribute name + const char *alt_name;// user-facing attribute name + mparm parm; +}; + +// defined in SQLConnect.c, also used in SQLBrowseConnect.c +extern const struct attr_setting attr_settings[]; +extern const int attr_setting_count; + +// look up attr_setting entry by name or alt_name, -1 if not found +int attr_setting_lookup(const char *attr_name); + + + + +#endif diff --git a/clients/odbc/driver/ODBCDbc.c b/clients/odbc/driver/ODBCDbc.c --- a/clients/odbc/driver/ODBCDbc.c +++ b/clients/odbc/driver/ODBCDbc.c @@ -48,11 +48,21 @@ ODBCDbc * newODBCDbc(ODBCEnv *env) { ODBCDbc *dbc; + msettings *settings; assert(env); dbc = (ODBCDbc *) malloc(sizeof(ODBCDbc)); - if (dbc == NULL) { + settings = msettings_create(); + + if ( + dbc == NULL + || settings == NULL + || msetting_set_string(settings, MP_USER, "monetdb") != NULL + || msetting_set_string(settings, MP_PASSWORD, "monetdb") != NULL + ) { + free(dbc); + msettings_destroy(settings); /* Memory allocation error */ addEnvError(env, "HY001", NULL, 0); return NULL; @@ -60,6 +70,7 @@ newODBCDbc(ODBCEnv *env) *dbc = (ODBCDbc) { .Env = env, + .settings = settings, .sql_attr_autocommit = SQL_AUTOCOMMIT_ON, /* default is autocommit */ .sql_attr_metadata_id = SQL_FALSE, /* add this dbc to start of the administrative linked dbc list */ @@ -173,16 +184,12 @@ destroyODBCDbc(ODBCDbc *dbc) /* cleanup own managed data */ deleteODBCErrorList(&dbc->Error); - if (dbc->dsn) - free(dbc->dsn); - if (dbc->uid) - free(dbc->uid); - if (dbc->pwd) - free(dbc->pwd); - if (dbc->host) - free(dbc->host); - if (dbc->dbname) - free(dbc->dbname); + msettings_destroy(dbc->settings); + free(dbc->dsn); + free(dbc->uid); + free(dbc->pwd); + free(dbc->host); + free(dbc->dbname); free(dbc); } diff --git a/clients/odbc/driver/ODBCDbc.h b/clients/odbc/driver/ODBCDbc.h --- a/clients/odbc/driver/ODBCDbc.h +++ b/clients/odbc/driver/ODBCDbc.h @@ -39,6 +39,7 @@ #include "ODBCEnv.h" #include "ODBCError.h" #include "mapi.h" +#include "msettings.h" typedef struct tODBCDRIVERDBC { @@ -51,6 +52,7 @@ typedef struct tODBCDRIVERDBC { int RetrievedErrors;/* # of errors already retrieved by SQLError */ /* connection information */ + msettings *settings;/* All connection parameters */ char *dsn; /* Data source name or NULL */ char *uid; /* User ID or NULL */ char *pwd; /* Password for User ID or NULL */ diff --git a/clients/odbc/driver/SQLConnect.c b/clients/odbc/driver/SQLConnect.c --- a/clients/odbc/driver/SQLConnect.c +++ b/clients/odbc/driver/SQLConnect.c @@ -32,6 +32,7 @@ #include "ODBCGlobal.h" #include "ODBCDbc.h" #include "ODBCUtil.h" +#include "ODBCAttrs.h" #inc
MonetDB: odbc-tls - Extract MNDBConnectSettings
Changeset: fbaffdac9bf4 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/fbaffdac9bf4 Modified Files: clients/odbc/driver/ODBCDbc.h clients/odbc/driver/SQLConnect.c Branch: odbc-tls Log Message: Extract MNDBConnectSettings diffs (127 lines): diff --git a/clients/odbc/driver/ODBCDbc.h b/clients/odbc/driver/ODBCDbc.h --- a/clients/odbc/driver/ODBCDbc.h +++ b/clients/odbc/driver/ODBCDbc.h @@ -169,4 +169,7 @@ SQLRETURN MNDBSetConnectAttr(ODBCDbc *db */ extern char *ODBCTranslateSQL(ODBCDbc *dbc, const SQLCHAR *query, size_t length, SQLULEN noscan); +extern SQLRETURN MNDBConnectSettings(ODBCDbc *dbc, msettings *settings); + + #endif diff --git a/clients/odbc/driver/SQLConnect.c b/clients/odbc/driver/SQLConnect.c --- a/clients/odbc/driver/SQLConnect.c +++ b/clients/odbc/driver/SQLConnect.c @@ -373,6 +373,10 @@ MNDBConnect(ODBCDbc *dbc, goto failure; } + error_explanation = msetting_set_long(settings, MP_MAPTOLONGVARCHAR, mapToLongVarchar); + if (error_explanation) + goto failure; + #ifdef ODBCDEBUG { free(scratch); @@ -381,38 +385,16 @@ MNDBConnect(ODBCDbc *dbc, } #endif - // Create mid and execute a bunch of commands before checking for errors. - mid = mapi_settings(settings); - if (mid) { - settings = NULL; // it has moved into 'mid' and must not be freed. - mapi_setAutocommit(mid, dbc->sql_attr_autocommit == SQL_AUTOCOMMIT_ON); - mapi_set_size_header(mid, true); - mapi_reconnect(mid); - } - if (mid == NULL || mapi_error(mid)) { - error_state = "08001"; - error_explanation = mid ? mapi_error_str(mid) : NULL; - goto failure; + assert(error_state == NULL); + assert(error_explanation == NULL); + + SQLRETURN ret; + + ret = MNDBConnectSettings(dbc, settings); + if (SQL_SUCCEEDED(ret)) { + settings = NULL; // must not be free'd now } - /* store internal information and clean up buffers */ - dbc->Connected = true; - dbc->mapToLongVarchar = mapToLongVarchar; - - // Move strings into the dbc struct, clearing whatever was there - // and leaving the original location NULL so they don't accidentally - // get free'd. - if (dbc->mid) - mapi_destroy(dbc->mid); - dbc->mid = mid; - mid = NULL; // it has moved into 'dbc' and must not be freed. - - get_serverinfo(dbc); - /* set timeout after we're connected */ - mapi_timeout(dbc->mid, dbc->sql_attr_connection_timeout * 1000); - - assert(error_state == NULL); - assert(error_explanation == NULL); goto end; failure: @@ -423,8 +405,9 @@ failure: error_state = "HY009"; // invalid argument } addDbcError(dbc, error_state, error_explanation, 0); + ret = SQL_ERROR; + // fallthrough - end: free(dsn); free(scratch); @@ -432,9 +415,42 @@ end: mapi_destroy(mid); msettings_destroy(settings); - return error_state == NULL ? SQL_SUCCESS : SQL_ERROR; + return ret; } +SQLRETURN +MNDBConnectSettings(ODBCDbc *dbc, msettings *settings) +{ + Mapi mid = mapi_settings(settings); + if (mid) { + mapi_setAutocommit(mid, dbc->sql_attr_autocommit == SQL_AUTOCOMMIT_ON); + mapi_set_size_header(mid, true); + mapi_reconnect(mid); + } + if (mid == NULL || mapi_error(mid)) { + const char *error_state = "08001"; + const char *error_explanation = mid ? mapi_error_str(mid) : NULL; + addDbcError(dbc, error_state, error_explanation, 0); + return SQL_ERROR; + } + + dbc->Connected = true; + dbc->mapToLongVarchar = msetting_long(settings, MP_MAPTOLONGVARCHAR); + + if (dbc->mid) + mapi_destroy(dbc->mid); + dbc->mid = mid; + + get_serverinfo(dbc); + /* set timeout after we're connected */ + mapi_timeout(dbc->mid, dbc->sql_attr_connection_timeout * 1000); + + return SQL_SUCCESS; +} + + + + SQLRETURN SQL_API SQLConnect(SQLHDBC ConnectionHandle, SQLCHAR *ServerName, ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: odbc-tls - allow_alt_name
Changeset: 7896311c77f6 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/7896311c77f6 Modified Files: clients/odbc/driver/ODBCAttrs.h clients/odbc/driver/SQLConnect.c Branch: odbc-tls Log Message: allow_alt_name diffs (31 lines): diff --git a/clients/odbc/driver/ODBCAttrs.h b/clients/odbc/driver/ODBCAttrs.h --- a/clients/odbc/driver/ODBCAttrs.h +++ b/clients/odbc/driver/ODBCAttrs.h @@ -31,7 +31,7 @@ extern const struct attr_setting attr_se extern const int attr_setting_count; // look up attr_setting entry by name or alt_name, -1 if not found -int attr_setting_lookup(const char *attr_name); +int attr_setting_lookup(const char *attr_name, bool allow_alt_name); diff --git a/clients/odbc/driver/SQLConnect.c b/clients/odbc/driver/SQLConnect.c --- a/clients/odbc/driver/SQLConnect.c +++ b/clients/odbc/driver/SQLConnect.c @@ -68,13 +68,13 @@ const struct attr_setting attr_settings[ const int attr_setting_count = sizeof(attr_settings) / sizeof(attr_settings[0]); int -attr_setting_lookup(const char *attr_name) +attr_setting_lookup(const char *attr_name, bool allow_alt_name) { for (int i = 0; i < attr_setting_count; i++) { const struct attr_setting *entry = &attr_settings[i]; if (strcasecmp(attr_name, entry->name) == 0) return i; - if (entry->alt_name && strcasecmp(attr_name, entry->alt_name) == 0) + if (allow_alt_name && entry->alt_name && strcasecmp(attr_name, entry->alt_name) == 0) return i; } return -1; ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: odbc-tls - Convert SQLDriverConnect
Changeset: 1995a9279d83 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/1995a9279d83 Modified Files: clients/odbc/driver/ODBCDbc.h clients/odbc/driver/SQLConnect.c clients/odbc/driver/SQLDriverConnect.c Branch: odbc-tls Log Message: Convert SQLDriverConnect diffs (truncated from 321 to 300 lines): diff --git a/clients/odbc/driver/ODBCDbc.h b/clients/odbc/driver/ODBCDbc.h --- a/clients/odbc/driver/ODBCDbc.h +++ b/clients/odbc/driver/ODBCDbc.h @@ -171,5 +171,9 @@ extern char *ODBCTranslateSQL(ODBCDbc *d extern SQLRETURN MNDBConnectSettings(ODBCDbc *dbc, msettings *settings); +extern bool makeNulTerminated(const SQLCHAR **argument, ssize_t argument_len, void **scratch); +extern const char* takeSettingsFromDS(msettings *settings, const char *dsn); +extern char* buildConnectionString(const char *dsn, const msettings *settings); + #endif diff --git a/clients/odbc/driver/SQLConnect.c b/clients/odbc/driver/SQLConnect.c --- a/clients/odbc/driver/SQLConnect.c +++ b/clients/odbc/driver/SQLConnect.c @@ -133,8 +133,8 @@ get_serverinfo(ODBCDbc *dbc) // and the previous value of '*scratch' will be free'd. // // '*argument' is never free'd. -static bool -make_nul_terminated(const SQLCHAR **argument, ssize_t argument_len, void **scratch) +bool +makeNulTerminated(const SQLCHAR **argument, ssize_t argument_len, void **scratch) { assert(argument != NULL); @@ -160,9 +160,8 @@ make_nul_terminated(const SQLCHAR **argu return value; } -#ifdef ODBCDEBUG -static char* -display_connect_string(const char *dsn, const msettings *settings) +char* +buildConnectionString(const char *dsn, const msettings *settings) { size_t pos = 0; @@ -227,7 +226,6 @@ end: return NULL; } } -#endif static int lookup(const char *dsn, const struct attr_setting *entry, char *buf, size_t bufsize) @@ -242,8 +240,8 @@ lookup(const char *dsn, const struct att return n; } -static const char* -take_settings_from_data_source(msettings *settings, const char *dsn) +const char* +takeSettingsFromDS(msettings *settings, const char *dsn) { char buf[1024] = { 0 }; @@ -302,7 +300,7 @@ MNDBConnect(ODBCDbc *dbc, goto failure; // ServerName is really the Data Source name - if (!make_nul_terminated(&ServerName, NameLength1, &scratch)) + if (!makeNulTerminated(&ServerName, NameLength1, &scratch)) goto failure; dsn = strdup((char*)ServerName); if (dsn == NULL) @@ -310,7 +308,7 @@ MNDBConnect(ODBCDbc *dbc, // data source settings take precedence over existing ones if (*dsn) { - error_state = take_settings_from_data_source(settings, dsn); + error_state = takeSettingsFromDS(settings, dsn); if (error_state != NULL) goto failure; } @@ -319,7 +317,7 @@ MNDBConnect(ODBCDbc *dbc, if (ODBCdebug == NULL || *ODBCdebug == 0) { const char *logfile = msetting_string(settings, MP_LOGFILE); if (*logfile) - setODBCdebug(logfile, false); + setODBCdebug(logfile, true); } #endif @@ -327,7 +325,7 @@ MNDBConnect(ODBCDbc *dbc, // override the pre-existing values and whatever came from the data source. // We also take the MAPIPORT environment variable into account. - if (!make_nul_terminated(&UserName, NameLength2, &scratch)) + if (!makeNulTerminated(&UserName, NameLength2, &scratch)) goto failure; if (UserName) { if (!*UserName) { @@ -340,7 +338,7 @@ MNDBConnect(ODBCDbc *dbc, goto failure; } - if (!make_nul_terminated(&Authentication, NameLength3, &scratch)) + if (!makeNulTerminated(&Authentication, NameLength3, &scratch)) goto failure; if (Authentication) { if (!*Authentication) { @@ -380,7 +378,9 @@ MNDBConnect(ODBCDbc *dbc, #ifdef ODBCDEBUG { free(scratch); - char *connstring = scratch = display_connect_string(dsn, settings); + char *connstring = scratch = buildConnectionString(dsn, settings); + if (!connstring) + goto failure; ODBCLOG("SQLConnect: %s\n", connstring); } #endif diff --git a/clients/odbc/driver/SQLDriverConnect.c b/clients/odbc/driver/SQLDriverConnect.c --- a/clients/odbc/driver/SQLDriverConnect.c +++ b/clients/odbc/driver/SQLDriverConnect.c @@ -32,6 +32,7 @@ #include "ODBCGlobal.h" #include "ODBCDbc.h" #include "ODBCUtil.h" +#include "ODBCAttrs.h" #ifdef HAVE_STRINGS_H #include/* for strcasecmp */ #else @@ -305,21 +306,27 @@ MNDBDriverConnect(ODBCDbc *dbc, SQLUSMALLINT DriverCompletion, int tryOnly) { - char *key, *attr; - char *dsn = 0, *uid = 0, *pwd = 0, *host
MonetDB: odbc-tls - ServerName can be null in SQLConnect
Changeset: 83b30c82018c for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/83b30c82018c Modified Files: clients/odbc/driver/SQLConnect.c Branch: odbc-tls Log Message: ServerName can be null in SQLConnect diffs (22 lines): diff --git a/clients/odbc/driver/SQLConnect.c b/clients/odbc/driver/SQLConnect.c --- a/clients/odbc/driver/SQLConnect.c +++ b/clients/odbc/driver/SQLConnect.c @@ -302,12 +302,14 @@ MNDBConnect(ODBCDbc *dbc, // ServerName is really the Data Source name if (!makeNulTerminated(&ServerName, NameLength1, &scratch)) goto failure; - dsn = strdup((char*)ServerName); - if (dsn == NULL) - goto failure; + if (ServerName != NULL) { + dsn = strdup((char*)ServerName); + if (dsn == NULL) + goto failure; + } // data source settings take precedence over existing ones - if (*dsn) { + if (dsn && *dsn) { error_state = takeSettingsFromDS(settings, dsn); if (error_state != NULL) goto failure; ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: odbc-tls - fixup odbcbrowse
Changeset: 9f58f6a6fcee for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/9f58f6a6fcee Modified Files: clients/odbc/samples/odbcbrowse.c Branch: odbc-tls Log Message: fixup odbcbrowse diffs (14 lines): diff --git a/clients/odbc/samples/odbcbrowse.c b/clients/odbc/samples/odbcbrowse.c --- a/clients/odbc/samples/odbcbrowse.c +++ b/clients/odbc/samples/odbcbrowse.c @@ -75,8 +75,8 @@ main(int argc, char **argv) { int exit_code; SQLRETURN ret; - SQLHANDLE env; - SQLHANDLE conn; + SQLHANDLE env = NULL; + SQLHANDLE conn = NULL; char *connection_string; SQLCHAR prompt[1024]; SQLSMALLINT prompt_size = (SQLSMALLINT) sizeof(prompt); ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: odbc-tls - Add driverconnect sample
Changeset: 51e7b33ccc10 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/51e7b33ccc10 Added Files: clients/odbc/samples/odbcdriverconnect.c Modified Files: clients/odbc/samples/CMakeLists.txt Branch: odbc-tls Log Message: Add driverconnect sample diffs (168 lines): diff --git a/clients/odbc/samples/CMakeLists.txt b/clients/odbc/samples/CMakeLists.txt --- a/clients/odbc/samples/CMakeLists.txt +++ b/clients/odbc/samples/CMakeLists.txt @@ -33,10 +33,20 @@ target_link_libraries(odbcbrowse PRIVATE ODBC::ODBC) + +add_executable(odbcdriverconnect + odbcdriverconnect.c) + +target_link_libraries(odbcdriverconnect + PRIVATE + ODBC::ODBC) + + install(TARGETS odbcsample1 arraytest odbcbrowse + odbcdriverconnect RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} @@ -47,6 +57,7 @@ if(WIN32) $ $ $ +$ DESTINATION ${CMAKE_INSTALL_BINDIR} OPTIONAL) endif() diff --git a/clients/odbc/samples/odbcdriverconnect.c b/clients/odbc/samples/odbcdriverconnect.c new file mode 100644 --- /dev/null +++ b/clients/odbc/samples/odbcdriverconnect.c @@ -0,0 +1,131 @@ +/* + * SPDX-License-Identifier: MPL-2.0 + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2024 MonetDB Foundation; + * Copyright August 2008 - 2023 MonetDB B.V.; + * Copyright 1997 - July 2008 CWI. + */ +#include +#include +#include +#include +#include +#include + +// borrowed from odbcsample1 +static void +prerr(SQLSMALLINT tpe, SQLHANDLE hnd, const char *func, const char *pref) +{ + SQLCHAR state[6]; + SQLINTEGER errnr; + SQLCHAR msg[256]; + SQLSMALLINT msglen; + + switch (SQLGetDiagRec(tpe, hnd, 1, state, &errnr, msg, sizeof(msg), &msglen)) { + case SQL_SUCCESS_WITH_INFO: + if (msglen >= (signed int) sizeof(msg)) + fprintf(stderr, "(message truncated)\n"); + /* fall through */ + case SQL_SUCCESS: + fprintf(stderr, "%s: %s: SQLstate %s, Errnr %d, Message %s\n", func, pref, (char*)state, (int)errnr, (char*)msg); + break; + case SQL_INVALID_HANDLE: + fprintf(stderr, "%s: %s, invalid handle passed to error function\n", func, pref); + break; + case SQL_ERROR: + fprintf(stderr, "%s: %s, unexpected error from SQLGetDiagRec\n", func, pref); + break; + case SQL_NO_DATA: + break; + default: + fprintf(stderr, "%s: %s, weird return value from SQLGetDiagRec\n", func, pref); + break; + } +} + +// borrowed from odbcsample1, with changes. +// return 0 on success, proper exit code on error. +static int +check(SQLRETURN ret, SQLSMALLINT tpe, SQLHANDLE hnd, const char *func) +{ + switch (ret) { + case SQL_SUCCESS: + return 0; + case SQL_SUCCESS_WITH_INFO: + prerr(tpe, hnd, func, "Info"); + return 0; + case SQL_ERROR: + prerr(tpe, hnd, func, "Error"); + return 1; + case SQL_INVALID_HANDLE: + fprintf(stderr, "%s: Error: invalid handle\n", func); + return 1; + default: + fprintf(stderr, "%s: Unexpected return value: %d\n", func, ret); + return 1; + } +} + +int +main(int argc, char **argv) +{ + int exit_code; + SQLRETURN ret; + SQLHANDLE env = NULL; + SQLHANDLE conn = NULL; + char *connection_string; + SQLCHAR prompt[1024]; + SQLSMALLINT prompt_size = (SQLSMALLINT) sizeof(prompt); + SQLSMALLINT required_size; + + if (argc != 2) { + fprintf(stderr, "Usage: odbcbrowse CONNECTSTRING\n"); + fprintf(stderr, "Exit code: 2 = need more data, 1 = other error\n"); + exit_code = 1; + goto end; + } + connection_string = argv[1]; + + // Prepare + + ret = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &env); + exit_code = check(ret, SQL_HANDLE_ENV, NULL, "SQLAllocHandle ENV"); + if (exit_code) + goto end; + + ret = SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, 0); + exit_code = check(ret, SQL_HANDLE_ENV, env, "SQLSetEnvAttr SQL_ATTR_ODBC_VERSION"); + if (exit_code) + goto end; + + ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &conn); + exit_code = check(ret, SQL_HANDLE_DBC, env, "SQLAllocHandle DBC"); + if (exit_code) + goto end; + + // We have a connection handle, let's connect + + ret = SQLDriverConnect(conn, NULL, (SQLCHAR*)connection_string, SQL_NTS, prompt, prompt_size, &required_size, SQL_DRIVER_NOPROMPT); + // ret = SQLBrowseConnectA(conn, (SQLCHAR*)connection_string, SQL_NTS, p
MonetDB: odbc-tls - Make connection string keys uppercase
Changeset: f75565a1b5c6 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/f75565a1b5c6 Modified Files: clients/odbc/driver/SQLConnect.c Branch: odbc-tls Log Message: Make connection string keys uppercase diffs (42 lines): diff --git a/clients/odbc/driver/SQLConnect.c b/clients/odbc/driver/SQLConnect.c --- a/clients/odbc/driver/SQLConnect.c +++ b/clients/odbc/driver/SQLConnect.c @@ -47,22 +47,22 @@ const struct attr_setting attr_settings[] = { - { "uid", "User", MP_USER }, - { "pwd", "Password", MP_PASSWORD }, - { "database", "Database", MP_DATABASE }, - { "port", "Port", MP_PORT }, - { "host", "Host", MP_HOST }, - { "sock", "Unix Socket", MP_SOCK }, - { "tls", "Encrypt", MP_TLS }, - { "cert", "Server Certificate", MP_CERT }, - { "certhash", "Server Certificate Hash", MP_CERTHASH }, - { "clientkey", "Client Key", MP_CLIENTKEY }, - { "clientcert", "Client Certificate", MP_CLIENTCERT }, - { "autocommit", "Autocommit", MP_AUTOCOMMIT }, - { "schema", "Schema", MP_SCHEMA }, - { "timezone", "Time Zone", MP_TIMEZONE }, - { "replysize", "Reply Size", MP_REPLYSIZE }, - { "logfile", "Log File", MP_LOGFILE }, + { "UID", "User", MP_USER }, + { "PWD", "Password", MP_PASSWORD }, + { "DATABASE", "Database", MP_DATABASE }, + { "PORT", "Port", MP_PORT }, + { "HOST", "Host", MP_HOST }, + { "SOCK", "Unix Socket", MP_SOCK }, + { "TLS", "Encrypt", MP_TLS }, + { "CERT", "Server Certificate", MP_CERT }, + { "CERTHASH", "Server Certificate Hash", MP_CERTHASH }, + { "CLIENTKEY", "Client Key", MP_CLIENTKEY }, + { "CLIENTCERT", "Client Certificate", MP_CLIENTCERT }, + { "AUTOCOMMIT", "Autocommit", MP_AUTOCOMMIT }, + { "SCHEMA", "Schema", MP_SCHEMA }, + { "TIMEZONE", "Time Zone", MP_TIMEZONE }, + { "REPLYSIZE", "Reply Size", MP_REPLYSIZE }, + { "LOGFILE", "Log File", MP_LOGFILE }, }; const int attr_setting_count = sizeof(attr_settings) / sizeof(attr_settings[0]); ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: odbc-tls - Separate with ";", not "; "
Changeset: 111de220fa00 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/111de220fa00 Modified Files: clients/odbc/driver/SQLConnect.c Branch: odbc-tls Log Message: Separate with ";", not "; " diffs (21 lines): diff --git a/clients/odbc/driver/SQLConnect.c b/clients/odbc/driver/SQLConnect.c --- a/clients/odbc/driver/SQLConnect.c +++ b/clients/odbc/driver/SQLConnect.c @@ -175,7 +175,7 @@ buildConnectionString(const char *dsn, c if (dsn) { if (reallocprintf(&buf, &pos, &cap, "DSN=%s", dsn) < 0) goto end; - sep = "; "; + sep = ";"; } for (int i = 0; i < attr_setting_count; i++) { @@ -210,7 +210,7 @@ buildConnectionString(const char *dsn, c if (show_this) { if (reallocprintf(&buf, &pos, &cap, "%s%s=%s", sep, entry->name, value) < 0) goto end; - sep = "; "; + sep = ";"; } } ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: odbc-tls - OBCGetKeyAttr destroys both string and count
Changeset: 0fae2841a17f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/0fae2841a17f Modified Files: clients/odbc/driver/SQLDriverConnect.c Branch: odbc-tls Log Message: OBCGetKeyAttr destroys both string and count diffs (34 lines): diff --git a/clients/odbc/driver/SQLDriverConnect.c b/clients/odbc/driver/SQLDriverConnect.c --- a/clients/odbc/driver/SQLDriverConnect.c +++ b/clients/odbc/driver/SQLDriverConnect.c @@ -312,6 +312,8 @@ MNDBDriverConnect(ODBCDbc *dbc, const char *sqlstate = NULL; size_t out_len; const char *scratch_no_alloc; + const SQLCHAR *cursor; + SQLSMALLINT n; // These will be free'd at the end label msettings *settings = NULL; @@ -352,7 +354,9 @@ MNDBDriverConnect(ODBCDbc *dbc, // figure out the DSN and load its settings dsn = NULL; - while (ODBCGetKeyAttr(&InConnectionString, &StringLength1, &key, &attr) > 0) { + cursor = InConnectionString; + n = StringLength1; + while (ODBCGetKeyAttr(&cursor, &n, &key, &attr) > 0) { if (strcasecmp(key, "dsn") == 0) { dsn = attr; attr = NULL; // avoid double free @@ -376,7 +380,9 @@ MNDBDriverConnect(ODBCDbc *dbc, } // Override with settings from the connect string itself - while (ODBCGetKeyAttr(&InConnectionString, &StringLength1, &key, &attr) > 0) { + cursor = InConnectionString; + n = StringLength1; + while (ODBCGetKeyAttr(&cursor, &n, &key, &attr) > 0) { int i = attr_setting_lookup(key, true); if (i >= 0) { mparm parm = attr_settings[i].parm; ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: odbc-tls - Merge upstream changes into ODBC refactoring
Changeset: bdeb1a56c020 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/bdeb1a56c020 Modified Files: clients/mapilib/msettings.h clients/odbc/driver/SQLConnect.c Branch: odbc-tls Log Message: Merge upstream changes into ODBC refactoring diffs (220 lines): diff --git a/clients/mapilib/msettings.h b/clients/mapilib/msettings.h --- a/clients/mapilib/msettings.h +++ b/clients/mapilib/msettings.h @@ -93,9 +93,9 @@ mparm_classify(mparm parm) /* returns NULL if not found, pointer to mparm if found */ mapi_export mparm mparm_parse(const char *name); -const char *mparm_name(mparm parm); -mparm mparm_enumerate(int i); -bool mparm_is_core(mparm parm); +mapi_export const char *mparm_name(mparm parm); +mapi_export mparm mparm_enumerate(int i); +mapi_export bool mparm_is_core(mparm parm); / @@ -114,8 +114,8 @@ mapi_export bool msettings_malloc_failed /* returns NULL if could not allocate */ mapi_export msettings *msettings_create(void); -msettings *msettings_clone(const msettings *mp); -extern const msettings *msettings_default; +mapi_export msettings *msettings_clone(const msettings *mp); +mapi_export const msettings *msettings_default; /* always returns NULL */ mapi_export msettings *msettings_destroy(msettings *mp); @@ -123,21 +123,21 @@ mapi_export msettings *msettings_destroy /* retrieve and set; call abort() on type error */ mapi_export const char* msetting_string(const msettings *mp, mparm parm); -msettings_error msetting_set_string(msettings *mp, mparm parm, const char* value) +mapi_export msettings_error msetting_set_string(msettings *mp, mparm parm, const char* value) __attribute__((__nonnull__(3))); mapi_export long msetting_long(const msettings *mp, mparm parm); -msettings_error msetting_set_long(msettings *mp, mparm parm, long value); +mapi_export msettings_error msetting_set_long(msettings *mp, mparm parm, long value); mapi_export bool msetting_bool(const msettings *mp, mparm parm); -msettings_error msetting_set_bool(msettings *mp, mparm parm, bool value); +mapi_export msettings_error msetting_set_bool(msettings *mp, mparm parm, bool value); /* parse into the appropriate type, or format into newly malloc'ed string (NULL means malloc failed) */ -msettings_error msetting_parse(msettings *mp, mparm parm, const char *text); -char *msetting_as_string(const msettings *mp, mparm parm); +mapi_export msettings_error msetting_parse(msettings *mp, mparm parm, const char *text); +mapi_export char *msetting_as_string(const msettings *mp, mparm parm); /* store ignored parameter */ -msettings_error msetting_set_ignored(msettings *mp, const char *key, const char *value); +mapi_export msettings_error msetting_set_ignored(msettings *mp, const char *key, const char *value); /* store named parameter */ mapi_export msettings_error msetting_set_named(msettings *mp, bool allow_core, const char *key, const char *value); diff --git a/clients/odbc/driver/SQLConnect.c b/clients/odbc/driver/SQLConnect.c --- a/clients/odbc/driver/SQLConnect.c +++ b/clients/odbc/driver/SQLConnect.c @@ -182,7 +182,7 @@ buildConnectionString(const char *dsn, c const struct attr_setting *entry = &attr_settings[i]; mparm parm = entry->parm; - if (parm == MP_TABLE || parm == MP_TABLESCHEMA) + if (parm == MP_IGNORE || parm == MP_TABLE || parm == MP_TABLESCHEMA) continue; free(value); diff --git a/clients/odbc/driver/SQLDisconnect.c b/clients/odbc/driver/SQLDisconnect.c --- a/clients/odbc/driver/SQLDisconnect.c +++ b/clients/odbc/driver/SQLDisconnect.c @@ -63,11 +63,31 @@ SQLDisconnect(SQLHDBC ConnectionHandle) mapi_destroy(dbc->mid); dbc->mid = NULL; + dbc->Connected = false; dbc->cachelimit = 0; dbc->Mdebug = 0; - dbc->Connected = false; dbc->has_comment = false; dbc->raw_strings = false; + if (dbc->dsn) { + free(dbc->dsn); + dbc->dsn = NULL; + } + if (dbc->uid) { + free(dbc->uid); + dbc->uid = NULL; + } + if (dbc->pwd) { + free(dbc->pwd); + dbc->pwd = NULL; + } + if (dbc->host) { + free(dbc->host); + dbc->host = NULL; + } + if (dbc->dbname) { + free(dbc->dbname); + dbc->dbname = NULL; + } return SQL_SUCCESS; } diff --git a/clients/odbc/winsetup/resource.h b/clients/odbc/winsetup/resource.h --- a/clients/odbc/winsetup/resource.h +++ b/clients/odbc/winsetup/resource.h @@ -23,6 +23,18 @@ #define IDC_EDIT_PORT 2005 #define IDC_EDIT_DATABASE 2006 #define IDC_EDIT_LOGFILE2007 +// new from Jun2024 +#define IDC_EDIT_AUTOCOMMIT 2011 +#define IDC_EDIT_REPLYSIZE 2012 +#defi
MonetDB: odbc-tls - Add MP__MAX constant to msettings.h
Changeset: 3bddcb6b64d3 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/3bddcb6b64d3 Modified Files: clients/mapilib/msettings.h Branch: odbc-tls Log Message: Add MP__MAX constant to msettings.h diffs (20 lines): diff --git a/clients/mapilib/msettings.h b/clients/mapilib/msettings.h --- a/clients/mapilib/msettings.h +++ b/clients/mapilib/msettings.h @@ -19,6 +19,7 @@ #define MP__BOOL_START (100) #define MP__LONG_START (200) #define MP__STRING_START (300) +#define MP__MAX (400) #ifdef __cplusplus extern "C" { @@ -71,6 +72,8 @@ typedef enum mparm { MP_SCHEMA, // TODO implement this MP_BINARY, MP_LOGFILE, + + // !! Make sure to keep them all below MP__MAX !! } mparm; typedef enum mparm_class { ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: odbc-tls - Implement SQLBrowseConnect
Changeset: acc4ede18819 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/acc4ede18819 Modified Files: clients/odbc/driver/ODBCAttrs.h clients/odbc/driver/ODBCDbc.c clients/odbc/driver/ODBCDbc.h clients/odbc/driver/SQLBrowseConnect.c clients/odbc/driver/SQLConnect.c clients/odbc/driver/SQLDisconnect.c clients/odbc/driver/SQLDriverConnect.c clients/odbc/samples/odbcbrowse.c tools/merovingian/daemon/client.c Branch: odbc-tls Log Message: Implement SQLBrowseConnect It treats UID and PWD as mandatory, DATABASE only if monetdbd asks for it. diffs (truncated from 587 to 300 lines): diff --git a/clients/odbc/driver/ODBCAttrs.h b/clients/odbc/driver/ODBCAttrs.h --- a/clients/odbc/driver/ODBCAttrs.h +++ b/clients/odbc/driver/ODBCAttrs.h @@ -21,9 +21,11 @@ #include "msettings.h" struct attr_setting { - const char *name;// canonical attribute name - const char *alt_name;// user-facing attribute name + const char *name;// canonical attribute name + const char *alt_name;// user-facing attribute name mparm parm; + // optional + const char *suggest_values; // SQLBrowseConnect suggestion, or NULL for "?" }; // defined in SQLConnect.c, also used in SQLBrowseConnect.c diff --git a/clients/odbc/driver/ODBCDbc.c b/clients/odbc/driver/ODBCDbc.c --- a/clients/odbc/driver/ODBCDbc.c +++ b/clients/odbc/driver/ODBCDbc.c @@ -76,6 +76,7 @@ newODBCDbc(ODBCEnv *env) /* add this dbc to start of the administrative linked dbc list */ .next = env->FirstDbc, .Type = ODBC_DBC_MAGIC_NR, /* set it valid */ + .setting_touched = { 0 }, }; env->FirstDbc = dbc; return dbc; diff --git a/clients/odbc/driver/ODBCDbc.h b/clients/odbc/driver/ODBCDbc.h --- a/clients/odbc/driver/ODBCDbc.h +++ b/clients/odbc/driver/ODBCDbc.h @@ -81,6 +81,7 @@ typedef struct tODBCDRIVERDBC { /* can't use ODBCStmt *FirstStmt here because of ordering of include files */ struct tODBCDRIVERSTMT *FirstStmt; /* first in list or NULL */ + char setting_touched[MP__MAX]; /* for SQLBrowseConnect. set 0 on init, 1 on touch, other is up to SQLBrowseConnect */ } ODBCDbc; @@ -170,9 +171,11 @@ SQLRETURN MNDBSetConnectAttr(ODBCDbc *db extern char *ODBCTranslateSQL(ODBCDbc *dbc, const SQLCHAR *query, size_t length, SQLULEN noscan); extern SQLRETURN MNDBConnectSettings(ODBCDbc *dbc, msettings *settings); +extern SQLRETURN MNDBDriverConnect(ODBCDbc *dbc, SQLHWND WindowHandle, const SQLCHAR *InConnectionString, SQLSMALLINT StringLength1, SQLCHAR *OutConnectionString, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength2Ptr, SQLUSMALLINT DriverCompletion, int tryOnly); extern bool makeNulTerminated(const SQLCHAR **argument, ssize_t argument_len, void **scratch); -extern const char* takeSettingsFromDS(msettings *settings, const char *dsn); +extern const char* takeFromDataSource(ODBCDbc *dbc, msettings *settings, const char *dsn); +extern SQLRETURN takeFromConnString(ODBCDbc *dbc, msettings *settings, const SQLCHAR *InConnectionString, SQLSMALLINT StringLength1, char **dsn_out); extern char* buildConnectionString(const char *dsn, const msettings *settings); diff --git a/clients/odbc/driver/SQLBrowseConnect.c b/clients/odbc/driver/SQLBrowseConnect.c --- a/clients/odbc/driver/SQLBrowseConnect.c +++ b/clients/odbc/driver/SQLBrowseConnect.c @@ -32,6 +32,7 @@ #include "ODBCGlobal.h" #include "ODBCDbc.h" #include "ODBCUtil.h" +#include "ODBCAttrs.h" #ifdef HAVE_STRINGS_H #include/* strcasecmp */ #endif @@ -44,6 +45,24 @@ #define SQLGetPrivateProfileString(section,entry,default,buffer,bufferlen,filename) ((int) strcpy_len(buffer,default,bufferlen)) #endif +static void +suggest_settings(ODBCDbc *dbc, char **buf, size_t *pos, size_t *cap, char touched_as, const char *prefix) +{ + for (int i = 0; i < attr_setting_count; i++) { + const struct attr_setting *entry = &attr_settings[i]; + mparm parm = entry->parm; + if (dbc->setting_touched[(int)parm] == touched_as) { + const char *sep = *pos > 0 ? ";" : ""; + const char *values = entry->suggest_values ? entry->suggest_values : "?"; + reallocprintf( + buf, pos, cap, + "%s%s%s:%s=%s", + sep, prefix, entry->name, entry->alt_name, values); + } + } +} + + static SQLRETURN MNDBBrowseConnect(ODBCDbc *dbc, @@ -53,179 +72,53 @@ MNDBBrowseConnect(ODBCDbc *dbc, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength2Ptr) { - char *key, *attr; - char *dsn, *uid, *pwd, *host, *dbname; - int port, mapToLongVarchar; - SQLSMALLINT len
MonetDB: odbc-tls - Properly maintain the dsn field
Changeset: 11c4e061a45b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/11c4e061a45b Modified Files: clients/odbc/driver/ODBCDbc.h clients/odbc/driver/SQLConnect.c clients/odbc/driver/SQLDisconnect.c clients/odbc/driver/SQLDriverConnect.c Branch: odbc-tls Log Message: Properly maintain the dsn field diffs (72 lines): diff --git a/clients/odbc/driver/ODBCDbc.h b/clients/odbc/driver/ODBCDbc.h --- a/clients/odbc/driver/ODBCDbc.h +++ b/clients/odbc/driver/ODBCDbc.h @@ -170,7 +170,7 @@ SQLRETURN MNDBSetConnectAttr(ODBCDbc *db */ extern char *ODBCTranslateSQL(ODBCDbc *dbc, const SQLCHAR *query, size_t length, SQLULEN noscan); -extern SQLRETURN MNDBConnectSettings(ODBCDbc *dbc, msettings *settings); +extern SQLRETURN MNDBConnectSettings(ODBCDbc *dbc, const char *dsn, msettings *settings); extern SQLRETURN MNDBDriverConnect(ODBCDbc *dbc, SQLHWND WindowHandle, const SQLCHAR *InConnectionString, SQLSMALLINT StringLength1, SQLCHAR *OutConnectionString, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength2Ptr, SQLUSMALLINT DriverCompletion, int tryOnly); extern bool makeNulTerminated(const SQLCHAR **argument, ssize_t argument_len, void **scratch); diff --git a/clients/odbc/driver/SQLConnect.c b/clients/odbc/driver/SQLConnect.c --- a/clients/odbc/driver/SQLConnect.c +++ b/clients/odbc/driver/SQLConnect.c @@ -469,7 +469,7 @@ MNDBConnect(ODBCDbc *dbc, SQLRETURN ret; - ret = MNDBConnectSettings(dbc, settings); + ret = MNDBConnectSettings(dbc, dsn, settings); if (SQL_SUCCEEDED(ret)) { settings = NULL; // must not be free'd now } @@ -498,7 +498,7 @@ end: } SQLRETURN -MNDBConnectSettings(ODBCDbc *dbc, msettings *settings) +MNDBConnectSettings(ODBCDbc *dbc, const char *dsn, msettings *settings) { Mapi mid = mapi_settings(settings); if (mid) { @@ -513,6 +513,9 @@ MNDBConnectSettings(ODBCDbc *dbc, msetti return SQL_ERROR; } + free(dbc->dsn); + dbc->dsn = dsn ? strdup(dsn) : NULL; + dbc->Connected = true; dbc->mapToLongVarchar = msetting_long(settings, MP_MAPTOLONGVARCHAR); diff --git a/clients/odbc/driver/SQLDisconnect.c b/clients/odbc/driver/SQLDisconnect.c --- a/clients/odbc/driver/SQLDisconnect.c +++ b/clients/odbc/driver/SQLDisconnect.c @@ -69,10 +69,9 @@ SQLDisconnect(SQLHDBC ConnectionHandle) dbc->Mdebug = 0; dbc->has_comment = false; dbc->raw_strings = false; - if (dbc->dsn) { - free(dbc->dsn); - dbc->dsn = NULL; - } + free(dbc->dsn); + dbc->dsn = NULL; + if (dbc->uid) { free(dbc->uid); dbc->uid = NULL; diff --git a/clients/odbc/driver/SQLDriverConnect.c b/clients/odbc/driver/SQLDriverConnect.c --- a/clients/odbc/driver/SQLDriverConnect.c +++ b/clients/odbc/driver/SQLDriverConnect.c @@ -369,7 +369,7 @@ MNDBDriverConnect(ODBCDbc *dbc, if (*scratch_no_alloc) setODBCdebug(scratch_no_alloc, false); - rc = MNDBConnectSettings(dbc, settings); + rc = MNDBConnectSettings(dbc, dsn, settings); if (!SQL_SUCCEEDED(rc)) goto end; // not to 'failure', all errors have already been logged ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: odbc-tls - Remove uid, pwd, host, port, dbname from ODB...
Changeset: dd0ba89f8a16 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/dd0ba89f8a16 Modified Files: clients/odbc/driver/ODBCDbc.c clients/odbc/driver/ODBCDbc.h clients/odbc/driver/ODBCUtil.c clients/odbc/driver/SQLColumnPrivileges.c clients/odbc/driver/SQLColumns.c clients/odbc/driver/SQLConnect.c clients/odbc/driver/SQLDisconnect.c clients/odbc/driver/SQLForeignKeys.c clients/odbc/driver/SQLGetInfo.c clients/odbc/driver/SQLPrimaryKeys.c clients/odbc/driver/SQLProcedureColumns.c clients/odbc/driver/SQLProcedures.c clients/odbc/driver/SQLSpecialColumns.c clients/odbc/driver/SQLStatistics.c clients/odbc/driver/SQLTablePrivileges.c clients/odbc/driver/SQLTables.c Branch: odbc-tls Log Message: Remove uid, pwd, host, port, dbname from ODBCDbc diffs (256 lines): diff --git a/clients/odbc/driver/ODBCDbc.c b/clients/odbc/driver/ODBCDbc.c --- a/clients/odbc/driver/ODBCDbc.c +++ b/clients/odbc/driver/ODBCDbc.c @@ -187,10 +187,6 @@ destroyODBCDbc(ODBCDbc *dbc) deleteODBCErrorList(&dbc->Error); msettings_destroy(dbc->settings); free(dbc->dsn); - free(dbc->uid); - free(dbc->pwd); - free(dbc->host); - free(dbc->dbname); free(dbc); } diff --git a/clients/odbc/driver/ODBCDbc.h b/clients/odbc/driver/ODBCDbc.h --- a/clients/odbc/driver/ODBCDbc.h +++ b/clients/odbc/driver/ODBCDbc.h @@ -54,11 +54,6 @@ typedef struct tODBCDRIVERDBC { /* connection information */ msettings *settings;/* All connection parameters */ char *dsn; /* Data source name or NULL */ - char *uid; /* User ID or NULL */ - char *pwd; /* Password for User ID or NULL */ - char *host; /* Server host */ - int port; /* Server port */ - char *dbname; /* Database Name or NULL */ bool Connected; /* whether we are connecte to a server */ bool has_comment; /* whether the server has sys.comments */ bool allow_hugeint; /* whether the application deals with HUGEINT */ diff --git a/clients/odbc/driver/ODBCUtil.c b/clients/odbc/driver/ODBCUtil.c --- a/clients/odbc/driver/ODBCUtil.c +++ b/clients/odbc/driver/ODBCUtil.c @@ -1203,11 +1203,11 @@ ODBCTranslateSQL(ODBCDbc *dbc, const SQL size_t repl3len = 0; if (repl == NULL) { if (strcmp(func->name, "user") == 0) { - repl = dbc->uid; + repl = msetting_string(dbc->settings, MP_USER); p1 = p2 = ""; quote = "'"; } else if (strcmp(func->name, "database") == 0) { - repl = dbc->dbname; + repl = msetting_string(dbc->settings, MP_DATABASE); p1 = p2 = ""; quote = "'"; } else if (strcmp(func->name, "convert") == 0) { diff --git a/clients/odbc/driver/SQLColumnPrivileges.c b/clients/odbc/driver/SQLColumnPrivileges.c --- a/clients/odbc/driver/SQLColumnPrivileges.c +++ b/clients/odbc/driver/SQLColumnPrivileges.c @@ -185,7 +185,7 @@ MNDBColumnPrivileges(ODBCStmt *stmt, /* Construct the selection condition query part */ if (NameLength1 > 0 && CatalogName != NULL) { /* filtering requested on catalog name */ - if (strcmp((char *) CatalogName, stmt->Dbc->dbname) != 0) { + if (strcmp((char *) CatalogName, msetting_string(stmt->Dbc->settings, MP_DATABASE)) != 0) { /* catalog name does not match the database name, so return no rows */ pos += snprintf(query + pos, querylen - pos, " and 1=2"); } diff --git a/clients/odbc/driver/SQLColumns.c b/clients/odbc/driver/SQLColumns.c --- a/clients/odbc/driver/SQLColumns.c +++ b/clients/odbc/driver/SQLColumns.c @@ -226,7 +226,7 @@ MNDBColumns(ODBCStmt *stmt, /* Construct the selection condition query part */ if (NameLength1 > 0 && CatalogName != NULL) { /* filtering requested on catalog name */ - if (str
MonetDB: odbc-tls - Approve new msettings exports
Changeset: 22c10467c604 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/22c10467c604 Modified Files: clients/Tests/exports.stable.out Branch: odbc-tls Log Message: Approve new msettings exports diffs (34 lines): diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out --- a/clients/Tests/exports.stable.out +++ b/clients/Tests/exports.stable.out @@ -734,12 +734,22 @@ const char *mo_find_option(opt *set, int void mo_free_options(opt *set, int setlen); void mo_print_options(opt *set, int setlen); int mo_system_config(opt **Set, int setlen); +mparm mparm_enumerate(int i); +bool mparm_is_core(mparm parm); +const char *mparm_name(mparm parm); mparm mparm_parse(const char *name); +char *msetting_as_string(const msettings *mp, mparm parm); bool msetting_bool(const msettings *mp, mparm parm); long msetting_long(const msettings *mp, mparm parm); +msettings_error msetting_parse(msettings *mp, mparm parm, const char *text); int msetting_parse_bool(const char *text); +msettings_error msetting_set_bool(msettings *mp, mparm parm, bool value); +msettings_error msetting_set_ignored(msettings *mp, const char *key, const char *value); +msettings_error msetting_set_long(msettings *mp, mparm parm, long value); msettings_error msetting_set_named(msettings *mp, bool allow_core, const char *key, const char *value); +msettings_error msetting_set_string(msettings *mp, mparm parm, const char *value) __attribute__((__nonnull__(3))); const char *msetting_string(const msettings *mp, mparm parm); +msettings *msettings_clone(const msettings *mp); long msettings_connect_binary(const msettings *mp); const char *msettings_connect_certhash_digits(const msettings *mp); const char *msettings_connect_clientcert(const msettings *mp); @@ -750,6 +760,7 @@ const char *msettings_connect_tcp(const enum msetting_tls_verify msettings_connect_tls_verify(const msettings *mp); const char *msettings_connect_unix(const msettings *mp); msettings *msettings_create(void); +const msettings *msettings_default; msettings *msettings_destroy(msettings *mp); bool msettings_malloc_failed(msettings_error err); bool msettings_parse_url(msettings *mp, const char *url, char **error_buffer); ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: odbc-tls - Merge upstream changes
Changeset: 68e522997644 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/68e522997644 Modified Files: clients/odbc/driver/SQLDriverConnect.c Branch: odbc-tls Log Message: Merge upstream changes diffs (truncated from 456 to 300 lines): diff --git a/clients/odbc/driver/SQLDriverConnect.c b/clients/odbc/driver/SQLDriverConnect.c --- a/clients/odbc/driver/SQLDriverConnect.c +++ b/clients/odbc/driver/SQLDriverConnect.c @@ -484,7 +484,7 @@ SQLDriverConnectW(SQLHDBC ConnectionHand addDbcError, dbc, return SQL_ERROR); rc = MNDBDriverConnect(dbc, WindowHandle, in, SQL_NTS, NULL, 0, &n, - DriverCompletion, 1); + DriverCompletion, 1); // Try Only if (!SQL_SUCCEEDED(rc)) return rc; clearDbcErrors(dbc); diff --git a/clients/odbc/winsetup/resource.h b/clients/odbc/winsetup/resource.h --- a/clients/odbc/winsetup/resource.h +++ b/clients/odbc/winsetup/resource.h @@ -29,7 +29,7 @@ #define IDC_EDIT_SCHEMA 2013 #define IDC_EDIT_TIMEZONE 2014 // Secure connections using TLS -#define IDC_EDIT_TLS2021 +#define IDC_EDIT_USETLS 2021 #define IDC_EDIT_SERVERCERT 2022 #define IDC_EDIT_SERVERCERTHASH 2023 #define IDC_EDIT_CLIENTKEY 2024 diff --git a/clients/odbc/winsetup/setup.c b/clients/odbc/winsetup/setup.c --- a/clients/odbc/winsetup/setup.c +++ b/clients/odbc/winsetup/setup.c @@ -77,13 +77,11 @@ ConfigDriver(HWND hwnd, WORD request, LP case ODBC_CONFIG_DRIVER: break; default: - SQLPostInstallerError(ODBC_ERROR_INVALID_REQUEST_TYPE, - "Invalid request"); + SQLPostInstallerError(ODBC_ERROR_INVALID_REQUEST_TYPE, "Invalid request"); return FALSE; } if (strcmp(driver, DriverName) != 0) { - SQLPostInstallerError(ODBC_ERROR_INVALID_NAME, - "Invalid driver name"); + SQLPostInstallerError(ODBC_ERROR_INVALID_NAME, "Invalid driver name"); return FALSE; } return TRUE; @@ -97,16 +95,17 @@ struct data { char *port; char *database; char *schema; - bool autocommit; - long replysize; - long timezone; + char *autocommit; + char *replysize; + char *timezone; char *logfile; // TLS settings - bool use_tls; + char *use_tls; char *servercert; char *servercerthash; char *clientkey; char *clientcert; + HWND parent; WORD request; }; @@ -155,7 +154,16 @@ DialogProc(HWND hwndDlg, UINT uMsg, WPAR SetDlgItemText(hwndDlg, IDC_EDIT_HOST, datap->host ? datap->host : ""); SetDlgItemText(hwndDlg, IDC_EDIT_PORT, datap->port ? datap->port : ""); SetDlgItemText(hwndDlg, IDC_EDIT_DATABASE, datap->database ? datap->database : ""); + SetDlgItemText(hwndDlg, IDC_EDIT_SCHEMA, datap->schema ? datap->schema : ""); + SetDlgItemText(hwndDlg, IDC_EDIT_AUTOCOMMIT, datap->autocommit ? datap->autocommit : "on"); + SetDlgItemText(hwndDlg, IDC_EDIT_REPLYSIZE, datap->replysize ? datap->replysize : ""); + SetDlgItemText(hwndDlg, IDC_EDIT_TIMEZONE, datap->timezone ? datap->timezone : ""); SetDlgItemText(hwndDlg, IDC_EDIT_LOGFILE, datap->logfile ? datap->logfile : ""); + SetDlgItemText(hwndDlg, IDC_EDIT_USETLS, datap->use_tls ? datap->use_tls : "off"); + SetDlgItemText(hwndDlg, IDC_EDIT_SERVERCERT, datap->servercert ? datap->servercert : ""); + SetDlgItemText(hwndDlg, IDC_EDIT_SERVERCERTHASH, datap->servercerthash ? datap->servercerthash : ""); + SetDlgItemText(hwndDlg, IDC_EDIT_CLIENTKEY, datap->clientkey ? datap->clientkey : ""); + SetDlgItemText(hwndDlg, IDC_EDIT_CLIENTCERT, datap->clientcert ? datap->clientcert : ""); if (datap->request == ODBC_ADD_DSN && datap->dsn && *datap->dsn) EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT_DSN), FALSE); return TRUE; @@ -167,10 +175,7 @@ DialogProc(HWND hwndDlg, UINT uMsg, WPAR if (datap->request != ODBC_ADD_DSN || datap->dsn == NULL || *datap->dsn == 0) { GetDlgItemText(hwndDlg, IDC_EDIT_DSN, buf, sizeof(buf)); if (!SQLValidDSN(buf)) { - MessageBox(hwndDlg, - "Invalid Datasource Name", - NULL, - MB_ICONERROR); + MessageBox(hwndDlg, "Invalid Datasource Name", NULL, MB_ICONERROR);
MonetDB: Dec2023 - Compiler doesn't know we're only formatting a...
Changeset: 387817f692f7 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/387817f692f7 Modified Files: monetdb5/modules/mal/mal_mapi.c Branch: Dec2023 Log Message: Compiler doesn't know we're only formatting an unsigned short value. diffs (12 lines): diff --git a/monetdb5/modules/mal/mal_mapi.c b/monetdb5/modules/mal/mal_mapi.c --- a/monetdb5/modules/mal/mal_mapi.c +++ b/monetdb5/modules/mal/mal_mapi.c @@ -525,7 +525,7 @@ start_listen(SOCKET *sockp, int *portp, hints.ai_family = AF_INET6; ipv6_vs6only = 0; } - char sport[8]; /* max "65535" */ + char sport[16]; /* max "65535", but compiler doesn't know */ snprintf(sport, sizeof(sport), "%d", *portp); for (;;) { /* max twice */ int check = getaddrinfo(listenaddr, sport, &hints, &result); ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: Dec2023 - UNLOGGED tables do have to be logged when the...
Changeset: 1cc64810035e for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/1cc64810035e Modified Files: sql/storage/bat/bat_storage.c Branch: Dec2023 Log Message: UNLOGGED tables do have to be logged when they are dropped. Fixes #7517. diffs (30 lines): diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c --- a/sql/storage/bat/bat_storage.c +++ b/sql/storage/bat/bat_storage.c @@ -3734,7 +3734,7 @@ drop_del(sql_trans *tr, sql_table *t) if (!isNew(t)) { storage *bat = ATOMIC_PTR_GET(&t->data); - trans_add_obj(tr, &t->base, bat, &tc_gc_del, &commit_destroy_del, NOT_TO_BE_LOGGED(t) ? NULL : &log_destroy_del); + trans_add_obj(tr, &t->base, bat, &tc_gc_del, &commit_destroy_del, isTempTable(t) ? NULL : &log_destroy_del); } return ok; } @@ -3744,7 +3744,7 @@ drop_col(sql_trans *tr, sql_column *c) { assert(!isNew(c)); sql_delta *d = ATOMIC_PTR_GET(&c->data); - trans_add(tr, &c->base, d, &tc_gc_col, &commit_destroy_del, NOT_TO_BE_LOGGED(c->t) ? NULL : &log_destroy_col); + trans_add(tr, &c->base, d, &tc_gc_col, &commit_destroy_del, isTempTable(c->t) ? NULL : &log_destroy_col); return LOG_OK; } @@ -3753,7 +3753,7 @@ drop_idx(sql_trans *tr, sql_idx *i) { assert(!isNew(i)); sql_delta *d = ATOMIC_PTR_GET(&i->data); - trans_add(tr, &i->base, d, &tc_gc_idx, &commit_destroy_del, NOT_TO_BE_LOGGED(i->t) ? NULL : &log_destroy_idx); + trans_add(tr, &i->base, d, &tc_gc_idx, &commit_destroy_del, isTempTable(i->t) ? NULL : &log_destroy_idx); return LOG_OK; } ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: odbc-tls - Do not set default values for user and password
Changeset: c3dbe7f05bc7 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/c3dbe7f05bc7 Modified Files: clients/odbc/driver/ODBCDbc.c Branch: odbc-tls Log Message: Do not set default values for user and password diffs (17 lines): diff --git a/clients/odbc/driver/ODBCDbc.c b/clients/odbc/driver/ODBCDbc.c --- a/clients/odbc/driver/ODBCDbc.c +++ b/clients/odbc/driver/ODBCDbc.c @@ -55,12 +55,7 @@ newODBCDbc(ODBCEnv *env) dbc = (ODBCDbc *) malloc(sizeof(ODBCDbc)); settings = msettings_create(); - if ( - dbc == NULL - || settings == NULL - || msetting_set_string(settings, MP_USER, "monetdb") != NULL - || msetting_set_string(settings, MP_PASSWORD, "monetdb") != NULL - ) { + if (dbc == NULL || settings == NULL) { free(dbc); msettings_destroy(settings); /* Memory allocation error */ ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: odbc-tls - Make sure the right settings are in the righ...
Changeset: da89b337cdf5 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/da89b337cdf5 Modified Files: clients/odbc/driver/SQLConnect.c Branch: odbc-tls Log Message: Make sure the right settings are in the right place at the right time diffs (48 lines): diff --git a/clients/odbc/driver/SQLConnect.c b/clients/odbc/driver/SQLConnect.c --- a/clients/odbc/driver/SQLConnect.c +++ b/clients/odbc/driver/SQLConnect.c @@ -52,7 +52,7 @@ const struct attr_setting attr_settings[ { "PWD", "Password", MP_PASSWORD }, { "DATABASE", "Database", MP_DATABASE }, { "PORT", "Port", MP_PORT }, - { "HOST", "Host", MP_HOST }, + { "HOST", "Server", MP_HOST }, { "SOCK", "Unix Socket", MP_SOCK }, { "TLS", "Encrypt", MP_TLS, .suggest_values = SUGGEST_BOOLEAN }, { "CERT", "Server Certificate", MP_CERT }, @@ -496,6 +496,12 @@ end: SQLRETURN MNDBConnectSettings(ODBCDbc *dbc, const char *dsn, msettings *settings) { + msettings *clone = msettings_clone(settings); + if (clone == NULL) { + addDbcError(dbc, "HY001", NULL, 0); + return SQL_ERROR; + } + Mapi mid = mapi_settings(settings); if (mid) { mapi_setAutocommit(mid, dbc->sql_attr_autocommit == SQL_AUTOCOMMIT_ON); @@ -512,14 +518,19 @@ MNDBConnectSettings(ODBCDbc *dbc, const free(dbc->dsn); dbc->dsn = dsn ? strdup(dsn) : NULL; - dbc->Connected = true; - dbc->mapToLongVarchar = msetting_long(settings, MP_MAPTOLONGVARCHAR); - if (dbc->mid) mapi_destroy(dbc->mid); dbc->mid = mid; + msettings_destroy(dbc->settings); + dbc->settings = clone; + + dbc->mapToLongVarchar = msetting_long(settings, MP_MAPTOLONGVARCHAR); + + dbc->Connected = true; + get_serverinfo(dbc); + /* set timeout after we're connected */ mapi_timeout(dbc->mid, dbc->sql_attr_connection_timeout * 1000); ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: odbc-tls - Merge 'odbcbrowse' and 'odbcdriverconnect' u...
Changeset: 4fcbb78900cd for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/4fcbb78900cd Added Files: clients/odbc/samples/odbcconnect.c Removed Files: clients/odbc/samples/odbcbrowse.c clients/odbc/samples/odbcdriverconnect.c Modified Files: clients/odbc/samples/CMakeLists.txt Branch: odbc-tls Log Message: Merge 'odbcbrowse' and 'odbcdriverconnect' utilities into 'odbcconnect' diffs (truncated from 527 to 300 lines): diff --git a/clients/odbc/samples/CMakeLists.txt b/clients/odbc/samples/CMakeLists.txt --- a/clients/odbc/samples/CMakeLists.txt +++ b/clients/odbc/samples/CMakeLists.txt @@ -26,27 +26,17 @@ target_link_libraries(arraytest PRIVATE ODBC::ODBC) -add_executable(odbcbrowse - odbcbrowse.c) +add_executable(odbcconnect + odbcconnect.c) -target_link_libraries(odbcbrowse +target_link_libraries(odbcconnect PRIVATE ODBC::ODBC) - -add_executable(odbcdriverconnect - odbcdriverconnect.c) - -target_link_libraries(odbcdriverconnect - PRIVATE - ODBC::ODBC) - - install(TARGETS odbcsample1 arraytest - odbcbrowse - odbcdriverconnect + odbcconnect RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} @@ -56,8 +46,7 @@ if(WIN32) install(FILES $ $ -$ -$ +$ DESTINATION ${CMAKE_INSTALL_BINDIR} OPTIONAL) endif() diff --git a/clients/odbc/samples/odbcbrowse.c b/clients/odbc/samples/odbcbrowse.c deleted file mode 100644 --- a/clients/odbc/samples/odbcbrowse.c +++ /dev/null @@ -1,136 +0,0 @@ -/* - * SPDX-License-Identifier: MPL-2.0 - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 2024 MonetDB Foundation; - * Copyright August 2008 - 2023 MonetDB B.V.; - * Copyright 1997 - July 2008 CWI. - */ -#include -#include -#include -#include -#include -#include - -// borrowed from odbcsample1 -static void -prerr(SQLSMALLINT tpe, SQLHANDLE hnd, const char *func, const char *pref) -{ - SQLCHAR state[6]; - SQLINTEGER errnr; - SQLCHAR msg[256]; - SQLSMALLINT msglen; - - switch (SQLGetDiagRec(tpe, hnd, 1, state, &errnr, msg, sizeof(msg), &msglen)) { - case SQL_SUCCESS_WITH_INFO: - if (msglen >= (signed int) sizeof(msg)) - fprintf(stderr, "(message truncated)\n"); - /* fall through */ - case SQL_SUCCESS: - fprintf(stderr, "%s: %s: SQLstate %s, Errnr %d, Message %s\n", func, pref, (char*)state, (int)errnr, (char*)msg); - break; - case SQL_INVALID_HANDLE: - fprintf(stderr, "%s: %s, invalid handle passed to error function\n", func, pref); - break; - case SQL_ERROR: - fprintf(stderr, "%s: %s, unexpected error from SQLGetDiagRec\n", func, pref); - break; - case SQL_NO_DATA: - break; - default: - fprintf(stderr, "%s: %s, weird return value from SQLGetDiagRec\n", func, pref); - break; - } -} - -// borrowed from odbcsample1, with changes. -// return 0 on success, proper exit code on error. -static int -check(SQLRETURN ret, SQLSMALLINT tpe, SQLHANDLE hnd, const char *func) -{ - switch (ret) { - case SQL_SUCCESS: - return 0; - case SQL_SUCCESS_WITH_INFO: - prerr(tpe, hnd, func, "Info"); - return 0; - case SQL_ERROR: - prerr(tpe, hnd, func, "Error"); - return 1; - case SQL_INVALID_HANDLE: - fprintf(stderr, "%s: Error: invalid handle\n", func); - return 1; - default: - fprintf(stderr, "%s: Unexpected return value: %d\n", func, ret); - return 1; - } -} - -int -main(int argc, char **argv) -{ - int exit_code; - SQLRETURN ret; - SQLHANDLE env = NULL; - SQLHANDLE conn = NULL; - char *connection_string; - SQLCHAR prompt[1024]; - SQLSMALLINT prompt_size = (SQLSMALLINT) sizeof(prompt); - SQLSMALLINT required_size; - - if (argc != 2) { - fprintf(stderr, "Usage: odbcbrowse CONNECTSTRING\n"); - fprintf(stderr, "Exit code: 2 = need more data, 1 = other error\n"); - exit_code = 1; - goto end; - } - connection_string = argv[1]; - - // Prepare - - ret = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &env); - exit_code = check(ret, SQL_HANDLE_ENV, NULL, "SQLAllocHandle ENV"); - if (exit_code) - goto end; - - ret = SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, 0); - exit_code = check(ret, SQL_HANDLE_ENV, env, "SQLSetEnvAttr SQL_ATTR_ODBC_VERSION"); - if (exit_code) - goto end; - - ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &conn); - exit_code = check
MonetDB: default - Merge with Dec2023 branch.
Changeset: 8a06076b4de2 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/8a06076b4de2 Modified Files: gdk/gdk_logger.c monetdb5/modules/mal/mal_mapi.c sql/backends/monet5/sql.c sql/server/rel_optimize_proj.c sql/server/rel_select.c sql/storage/bat/bat_storage.c sql/storage/store.c Branch: default Log Message: Merge with Dec2023 branch. diffs (165 lines): diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -3458,6 +3458,12 @@ log_tstart(logger *lg, bool flushnow, ul { rotation_lock(lg); if (flushnow) { + if (file_id == NULL) { + /* special case: ask store_manager to rotate log file */ + lg->file_age = 0; + rotation_unlock(lg); + return GDK_SUCCEED; + } /* I am now the exclusive flusher */ if (ATOMIC_GET(&lg->nr_flushers)) { /* I am waiting until all existing flushers are done */ @@ -3512,7 +3518,6 @@ log_printinfo(logger *lg) rotation_lock(lg); printf("current log file "ULLFMT", last handled log file "ULLFMT"\n", lg->id, lg->saved_id); - rotation_unlock(lg); printf("current transaction id %d, saved transaction id %d\n", lg->tid, lg->saved_tid); printf("number of flushers: %d\n", (int) ATOMIC_GET(&lg->nr_flushers)); @@ -3525,4 +3530,5 @@ log_printinfo(logger *lg) buf[0] = 0; printf("pending range "ULLFMT": drops %"PRIu64", last_ts %"PRIu64", flushed_ts %"PRIu64", refcount %"PRIu64"%s%s\n", p->id, (uint64_t) ATOMIC_GET(&p->drops), (uint64_t) ATOMIC_GET(&p->last_ts), (uint64_t) ATOMIC_GET(&p->flushed_ts), (uint64_t) ATOMIC_GET(&p->refcount), buf, p == lg->current ? " (current)" : ""); } + rotation_unlock(lg); } diff --git a/monetdb5/modules/atoms/xml.c b/monetdb5/modules/atoms/xml.c --- a/monetdb5/modules/atoms/xml.c +++ b/monetdb5/modules/atoms/xml.c @@ -735,9 +735,9 @@ XMLxml2str(str *s, const xml *x) } str -XMLstr2xml(xml *x, const char **s) +XMLstr2xml(xml *x, const char *const*val) { - (void) s; + (void) val; (void) x; return createException(MAL, "xml.xml2str", SQLSTATE(HY005) NO_LIBXML_FATAL); } diff --git a/monetdb5/modules/mal/mal_mapi.c b/monetdb5/modules/mal/mal_mapi.c --- a/monetdb5/modules/mal/mal_mapi.c +++ b/monetdb5/modules/mal/mal_mapi.c @@ -527,7 +527,7 @@ start_listen(SOCKET *sockp, int *portp, hints.ai_family = AF_INET6; ipv6_vs6only = 0; } - char sport[8]; /* max "65535" */ + char sport[16]; /* max "65535", but compiler doesn't know */ snprintf(sport, sizeof(sport), "%d", *portp); for (;;) { /* max twice */ int check = getaddrinfo(listenaddr, sport, &hints, &result); diff --git a/sql/ChangeLog.Dec2023 b/sql/ChangeLog.Dec2023 --- a/sql/ChangeLog.Dec2023 +++ b/sql/ChangeLog.Dec2023 @@ -1,3 +1,12 @@ # ChangeLog file for sql # This file is updated with Maddlog +* Wed May 15 2024 Sjoerd Mullender +- When sys.persist_unlogged is called for a table, it may return that + zero rows were persisted. If this is because the call was done too + early, i.e. the table was recently created and the write-ahead log + where this was logged has not been processed yet, the call will + request an immediate write-ahead log rotation. This means that the + WAL will be processed as soon as possible and a new call to + sys.persist_unlogged soon after will likely return a positive result. + diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -4471,6 +4471,16 @@ SQLpersist_unlogged(Client cntxt, MalBlk GDKfree(sizes); } count = d_bi.count; + } else { + /* special case of log_tstart: third arg == NULL with second arg +* true is request to rotate log file ASAP */ + store->logger_api.log_tstart(store, true, NULL); + /* special case for sql->debug: if 1024 bit is set, +* store_manager doesn't wait for 30 seconds of idle time before +* attempting to rotate */ + MT_lock_set(&store->flush); + store->debug |= 1024; + MT_lock_unset(&store->flush); } bat_iterator_end(&d_bi); diff --git a/sql/server/rel_optimize_proj.c b/sql/server/rel_optimize_proj.c --- a/sql/server/rel_optimize_proj.c +++ b/sql/server/rel_optimize_proj.c @@ -907,7 +907,7 @@ rel_split_project_(visitor *v, sql_rel * } if (is_set(rel->op) || is_basetable(rel->op)) return rel; - if (rel->l) { + if
MonetDB: check - disallow arbitrary subqueries in CHECK constraints
Changeset: 3f4075dc2680 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/3f4075dc2680 Modified Files: sql/server/rel_rel.h sql/server/rel_schema.c sql/server/rel_select.c sql/test/2024/Tests/check.test Branch: check Log Message: disallow arbitrary subqueries in CHECK constraints diffs (67 lines): diff --git a/sql/server/rel_rel.h b/sql/server/rel_rel.h --- a/sql/server/rel_rel.h +++ b/sql/server/rel_rel.h @@ -35,6 +35,7 @@ #define psm_call (1 << 15) //ORed #define sql_or (1 << 16) //ORed #define sql_merge(1 << 17) //ORed +#define sql_no_subquery (1 << 18) //ORed #define is_sql_from(X) ((X & sql_from) == sql_from) #define is_sql_where(X)((X & sql_where) == sql_where) @@ -54,6 +55,7 @@ #define is_psm_call(X) ((X & psm_call) == psm_call) #define is_sql_or(X) ((X & sql_or) == sql_or) #define is_sql_merge(X)((X & sql_merge) == sql_merge) +#define is_sql_no_subquery(X) ((X & sql_no_subquery) == sql_no_subquery) #define is_anyequal_func(sf) (strcmp((sf)->func->base.name, "sql_anyequal") == 0 || strcmp((sf)->func->base.name, "sql_not_anyequal") == 0) #define is_anyequal(sf) (strcmp((sf)->func->base.name, "sql_anyequal") == 0) diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c --- a/sql/server/rel_schema.c +++ b/sql/server/rel_schema.c @@ -22,6 +22,7 @@ #include "rel_psm.h" #include "rel_dump.h" #include "rel_propagate.h" +#include "rel_unnest.h" #include "sql_parser.h" #include "sql_privileges.h" #include "sql_partition.h" @@ -409,8 +410,8 @@ sql_rel* create_check_plan(sql_query *qu mvc *sql = query->sql; exp_kind ek = {type_value, card_value, FALSE}; sql_rel* rel = rel_basetable(sql, t, t->base.name); - sql_exp *e = rel_logical_value_exp(query, &rel, s->data.sym, sql_sel, ek); - rel->exps = rel_base_projection(sql, rel, 0); + sql_exp *e = rel_logical_value_exp(query, &rel, s->data.sym, sql_sel | sql_no_subquery, ek); + rel->exps = rel_base_projection(sql, rel, 0); list *pexps = sa_list(sql->sa); pexps = append(pexps, e); rel = rel_project(sql->sa, rel, pexps); diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -4988,6 +4988,9 @@ rel_value_exp2(sql_query *query, sql_rel assert(se->token == SQL_SELECT); exp_kind nek = ek; nek.aggr = is_sql_aggr(f); + if (is_sql_no_subquery(f)) + return sql_error(sql, 02, SQLSTATE(42000) "SELECT: subquery not allowed"); + r = rel_subquery(query, se, nek); } if (rel && *rel) { diff --git a/sql/test/2024/Tests/check.test b/sql/test/2024/Tests/check.test --- a/sql/test/2024/Tests/check.test +++ b/sql/test/2024/Tests/check.test @@ -33,3 +33,9 @@ update bar set i = 50 where i = 30 statement error update bar set i = 50, j = 40 where i = 30 + +statement error +create table baz(j int check (j > (select max(i) from foo))) + +statement error +create table baz(j int check (j in (select i from foo))) ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: check - merge with default
Changeset: 91250c27a94f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/91250c27a94f Modified Files: sql/backends/monet5/rel_bin.c sql/server/rel_rel.h sql/server/rel_select.c sql/server/sql_parser.y sql/storage/store.c Branch: check Log Message: merge with default diffs (truncated from 36794 to 300 lines): diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -825,3 +825,5 @@ dcc8c702e685a4faf21ccf663028d1bc3d1165d1 dcc8c702e685a4faf21ccf663028d1bc3d1165d1 Dec2023_SP1_release d656785f49ee62c19705722aa6b7c171904c64d5 Dec2023_7 d656785f49ee62c19705722aa6b7c171904c64d5 Dec2023_SP2_release +9a694c41042503a22d6c92aeab5bc4ca1912b62e Dec2023_9 +9a694c41042503a22d6c92aeab5bc4ca1912b62e Dec2023_SP3_release diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ # ChangeLog file for devel # This file is updated with Maddlog +* Wed May 8 2024 Sjoerd Mullender +- The shared library (.dll aka .so files) now have the version number + as part of the name. This should allow the building of compatibility + versions that can be installed in parallel to the latest version. +- Some of the Debian/Ubuntu packages have been renamed. The old monetdb5 + names have been changed to plain monetdb, and libmonetdb5-server-* + packages have been renamed monetdb-*. +- The names of some of the provided RPM files have been changed. + References to the old MonetDB5 name have been removed. All packages + are now just MonetDB. + +* Wed May 8 2024 Niels Nes +- Add support for select exp, count(*) group by 1 order by 1; ie. using + numeric references Added support for group by all and order by all. The + later is ordering on all columns of the selection. The group by all + finds all expressions from the selections which aren't aggregations + and groups on those. All can also be replaced by '*'. + diff --git a/MonetDB.spec b/MonetDB.spec --- a/MonetDB.spec +++ b/MonetDB.spec @@ -8,8 +8,12 @@ # Copyright August 2008 - 2023 MonetDB B.V.; # Copyright 1997 - July 2008 CWI. -%global name MonetDB %global version 11.50.0 + +%bcond_with compat + +%global name MonetDB%{?with_compat:%version} + %{!?buildno: %global buildno %(date +%Y%m%d)} # Use bcond_with to add a --with option; i.e., "without" is default. @@ -57,7 +61,7 @@ # available. However, the geos library is available in the Extra # Packages for Enterprise Linux (EPEL). %if %{fedpkgs} && (0%{?rhel} != 7) && (0%{?rhel} != 8) -# By default create the MonetDB-geom-MonetDB5 package on Fedora and RHEL 7 +# By default create the MonetDB-geom package on Fedora and RHEL 7 %bcond_without geos %endif @@ -91,7 +95,7 @@ Group: Applications/Databases License: MPL-2.0 URL: https://www.monetdb.org/ BugURL: https://github.com/MonetDB/MonetDB/issues -Source: https://www.monetdb.org/downloads/sources/Dec2023-SP2/%{name}-%{version}.tar.bz2 +Source: https://www.monetdb.org/downloads/sources/Dec2023-SP3/MonetDB-%{version}.tar.bz2 # The Fedora packaging document says we need systemd-rpm-macros for # the _unitdir and _tmpfilesdir macros to exist; however on RHEL 7 @@ -117,7 +121,9 @@ BuildRequires: unixODBC-devel BuildRequires: readline-devel %else BuildRequires: pkgconfig(bzip2) +%if %{without compat} BuildRequires: pkgconfig(odbc) +%endif BuildRequires: pkgconfig(readline) %endif %if %{with fits} @@ -154,8 +160,8 @@ BuildRequires: pkgconfig(libR) # BuildRequires: pkgconfig(valgrind)# -DWITH_VALGRIND=ON %if (0%{?fedora} >= 22) -Recommends: %{name}-SQL-server5%{?_isa} = %{version}-%{release} -Recommends: MonetDB5-server%{?_isa} = %{version}-%{release} +Recommends: %{name}-SQL%{?_isa} = %{version}-%{release} +Recommends: %{name}-server%{?_isa} = %{version}-%{release} Suggests: %{name}-client%{?_isa} = %{version}-%{release} %endif @@ -167,8 +173,8 @@ accelerators. It also has an SQL front This package contains the core components of MonetDB in the form of a single shared library. If you want to use MonetDB, you will certainly -need this package, but you will also need at least the MonetDB5-server -package, and most likely also %{name}-SQL-server5, as well as one or +need this package, but you will also need at least the %{name}-server +package, and most likely also %{name}-SQL, as well as one or more client packages. %ldconfig_scriptlets @@ -176,8 +182,9 @@ more client packages. %files %license COPYING %defattr(-,root,root) -%{_libdir}/libbat.so.* +%{_libdir}/libbat*.so.* +%if %{without compat} %package devel Summary: MonetDB development files Group: Applications/Databases @@ -202,8 +209,9 @@ functionality of MonetDB. %{_includedir}/monetdb/mstring.h %exclude %{_includedir}/monetdb/monetdbe.h %{_includedir}/monetdb/monet*.h -%{_libdir}/libbat.so +%{_libdir}/libbat*.so %{_libdir}/pkgconfig/monetdb-gdk.pc +%endif %package stream Summary: MonetDB stream library @@ -223,8 +231,9 @@ various other components. %files stream %license COPYING %
MonetDB: default - solved issue #7514, handle window function wi...
Changeset: 28b1ec5883ad for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/28b1ec5883ad Added Files: sql/test/BugTracker-2024/Tests/7514-wrong-window-function.test Modified Files: sql/server/rel_select.c sql/test/BugTracker-2024/Tests/All Branch: default Log Message: solved issue #7514, handle window function with more than 2 arguments diffs (60 lines): diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -4744,6 +4744,23 @@ rel_rankop(sql_query *query, sql_rel **r char *uaname = SA_NEW_ARRAY(sql->ta, char, strlen(aname) + 1); return sql_error(sql, 02, SQLSTATE(42000) "%s: window functions cannot be nested", toUpperCopy(uaname, aname)); } + if (window_function->token == SQL_UNOP || window_function->token == SQL_OP) { + window_function->token = SQL_NOP; + dn->next->next->data.lval = dlist_append_symbol(sql->sa, dlist_create( sql->sa ), dn->next->next->data.sym); /* make a list */ + } + if (window_function->token == SQL_BINOP) { + window_function->token = SQL_NOP; + dn->next->next->data.lval = dlist_append_symbol(sql->sa, dlist_append_symbol(sql->sa, dlist_create( sql->sa ), dn->next->next->data.sym), dn->next->next->next->data.sym); /* make a list */ + dn->next->next->next = dn->next->next->next->next; /* skip second arg */ + } + if (window_function->token == SQL_AGGR) + dn->next->next->data.lval = dlist_append_symbol(sql->sa, dlist_create( sql->sa ), dn->next->next->data.sym); /* make a list */ + if (window_function->token == SQL_NOP) + window_function->token = SQL_AGGR; + if (window_function->token != SQL_RANK && window_function->token != SQL_AGGR) { + char *uaname = SA_NEW_ARRAY(sql->ta, char, strlen(aname) + 1); + return sql_error(sql, 02, SQLSTATE(42000) "SELECT: window function '%s' unknown", toUpperCopy(uaname, aname)); + } /* window operations are only allowed in the projection */ if (!is_sql_sel(f)) @@ -4814,7 +4831,7 @@ rel_rankop(sql_query *query, sql_rel **r } } else { /* aggregation function call */ distinct = dn->next->data.i_val; - for (dargs = dn->next->next ; dargs && dargs->data.sym ; dargs = dargs->next) { + for (dargs = dn->next->next->data.lval->h ; dargs && dargs->data.sym ; dargs = dargs->next) { exp_kind ek = {type_value, card_column, FALSE}; sql_subtype *empty = sql_bind_localtype("void"), *bte = sql_bind_localtype("bte"); diff --git a/sql/test/BugTracker-2024/Tests/7514-wrong-window-function.test b/sql/test/BugTracker-2024/Tests/7514-wrong-window-function.test new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2024/Tests/7514-wrong-window-function.test @@ -0,0 +1,11 @@ +statement error SELECT: no such window function 'wrong_function'(tinyint, tinyint, tinyint) +select + wrong_function(col1, col2, col3) over w +from + (select 0 as col1, 1 as col2, 2 as col3) t window w as (partition by col1) + +statement error SELECT: identifier 'wrong_column' unknown +select + wrong_function(col1, col2, wrong_column) over w +from + (select 0 as col1, 1 as col2, 2 as col3) t window w as (partition by col1) diff --git a/sql/test/BugTracker-2024/Tests/All b/sql/test/BugTracker-2024/Tests/All --- a/sql/test/BugTracker-2024/Tests/All +++ b/sql/test/BugTracker-2024/Tests/All @@ -58,3 +58,4 @@ field-arg-error-Bug-7506 7511-password-hash-missing-error 7512-concurrent-globaltmp-instantiate-crash 7513-uri-authority-parse-issue +7514-wrong-window-function ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org
MonetDB: odbc-tls - Silence some warnings, but is it safe?
Changeset: 4284dd07f029 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/4284dd07f029 Modified Files: clients/odbc/driver/SQLBrowseConnect.c clients/odbc/driver/SQLDriverConnect.c Branch: odbc-tls Log Message: Silence some warnings, but is it safe? diffs (24 lines): diff --git a/clients/odbc/driver/SQLBrowseConnect.c b/clients/odbc/driver/SQLBrowseConnect.c --- a/clients/odbc/driver/SQLBrowseConnect.c +++ b/clients/odbc/driver/SQLBrowseConnect.c @@ -113,7 +113,7 @@ MNDBBrowseConnect(ODBCDbc *dbc, if (buf && pos) { size_t n = strcpy_len((char*)OutConnectionString, buf, BufferLength); if (StringLength2Ptr) - *StringLength2Ptr = n; + *StringLength2Ptr = (SQLSMALLINT)n; } free(buf); diff --git a/clients/odbc/driver/SQLDriverConnect.c b/clients/odbc/driver/SQLDriverConnect.c --- a/clients/odbc/driver/SQLDriverConnect.c +++ b/clients/odbc/driver/SQLDriverConnect.c @@ -382,7 +382,7 @@ MNDBDriverConnect(ODBCDbc *dbc, goto failure; out_len = strcpy_len((char*)OutConnectionString, scratch_alloc, BufferLength); if (StringLength2Ptr) - *StringLength2Ptr = out_len; + *StringLength2Ptr = (SQLSMALLINT)out_len; if (out_len + 1 > (size_t)BufferLength) { addDbcError(dbc, "01004", NULL, 0); rc = SQL_SUCCESS_WITH_INFO; ___ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org