MonetDB: default - solved issue #7514, handle window function wi...

2024-05-17 Thread Niels Nes via checkin-list
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: check - merge with default

2024-05-17 Thread Yunus Koning via checkin-list
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: check - disallow arbitrary subqueries in CHECK constraints

2024-05-17 Thread Yunus Koning via checkin-list
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, , s->data.sym, sql_sel, 
ek);
-   rel->exps = rel_base_projection(sql, rel, 0);
+   sql_exp *e = rel_logical_value_exp(query, , 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: default - Merge with Dec2023 branch.

2024-05-17 Thread Sjoerd Mullender via checkin-list
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(>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(>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(>drops), (uint64_t) ATOMIC_GET(>last_ts), (uint64_t) 
ATOMIC_GET(>flushed_ts), (uint64_t) ATOMIC_GET(>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, , );
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(>flush);
+   store->debug |= 1024;
+   MT_lock_unset(>flush);
}
 
bat_iterator_end(_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 (rel->l && (rel->op != op_table || rel->flag != 

MonetDB: odbc-tls - Merge 'odbcbrowse' and 'odbcdriverconnect' u...

2024-05-17 Thread Joeri van Ruth via checkin-list
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, , msg, sizeof(msg), 
)) {
-   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, );
-   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, );
-   exit_code = check(ret, SQL_HANDLE_DBC, 

MonetDB: odbc-tls - Make sure the right settings are in the righ...

2024-05-17 Thread Joeri van Ruth via checkin-list
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 - Do not set default values for user and password

2024-05-17 Thread Joeri van Ruth via checkin-list
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: Dec2023 - UNLOGGED tables do have to be logged when the...

2024-05-17 Thread Sjoerd Mullender via checkin-list
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(>data);
-   trans_add_obj(tr, >base, bat, _gc_del, 
_destroy_del, NOT_TO_BE_LOGGED(t) ? NULL : _destroy_del);
+   trans_add_obj(tr, >base, bat, _gc_del, 
_destroy_del, isTempTable(t) ? NULL : _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(>data);
-   trans_add(tr, >base, d, _gc_col, _destroy_del, 
NOT_TO_BE_LOGGED(c->t) ? NULL : _destroy_col);
+   trans_add(tr, >base, d, _gc_col, _destroy_del, 
isTempTable(c->t) ? NULL : _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(>data);
-   trans_add(tr, >base, d, _gc_idx, _destroy_del, 
NOT_TO_BE_LOGGED(i->t) ? NULL : _destroy_idx);
+   trans_add(tr, >base, d, _gc_idx, _destroy_del, 
isTempTable(i->t) ? NULL : _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: Dec2023 - Compiler doesn't know we're only formatting a...

2024-05-17 Thread Sjoerd Mullender via checkin-list
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, , );
___
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

2024-05-17 Thread Joeri van Ruth via checkin-list
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, ,
-  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: odbc-tls - Approve new msettings exports

2024-05-17 Thread Joeri van Ruth via checkin-list
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 - Remove uid, pwd, host, port, dbname from ODB...

2024-05-17 Thread Joeri van Ruth via checkin-list
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(>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 

MonetDB: odbc-tls - Properly maintain the dsn field

2024-05-17 Thread Joeri van Ruth via checkin-list
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 - Implement SQLBrowseConnect

2024-05-17 Thread Joeri van Ruth via checkin-list
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 = _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 - Add MP__MAX constant to msettings.h

2024-05-17 Thread Joeri van Ruth via checkin-list
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 - Merge upstream changes into ODBC refactoring

2024-05-17 Thread Joeri van Ruth via checkin-list
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 = _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
+#define 

MonetDB: odbc-tls - OBCGetKeyAttr destroys both string and count

2024-05-17 Thread Joeri van Ruth via checkin-list
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(, , , ) 
> 0) {
+   cursor = InConnectionString;
+   n = StringLength1;
+   while (ODBCGetKeyAttr(, , , ) > 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(, , , ) 
> 0) {
+   cursor = InConnectionString;
+   n = StringLength1;
+   while (ODBCGetKeyAttr(, , , ) > 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 - Separate with ";", not "; "

2024-05-17 Thread Joeri van Ruth via checkin-list
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(, , , "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(, , , "%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 - Make connection string keys uppercase

2024-05-17 Thread Joeri van Ruth via checkin-list
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 - Add driverconnect sample

2024-05-17 Thread Joeri van Ruth via checkin-list
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, , msg, sizeof(msg), 
)) {
+   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, );
+   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, );
+   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, _size, SQL_DRIVER_NOPROMPT);
+   // ret = SQLBrowseConnectA(conn, (SQLCHAR*)connection_string, SQL_NTS, 
prompt, prompt_size, _size);
+  

MonetDB: odbc-tls - fixup odbcbrowse

2024-05-17 Thread Joeri van Ruth via checkin-list
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 - ServerName can be null in SQLConnect

2024-05-17 Thread Joeri van Ruth via checkin-list
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(, NameLength1, ))
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 - Convert SQLDriverConnect

2024-05-17 Thread Joeri van Ruth via checkin-list
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(, NameLength1, ))
+   if (!makeNulTerminated(, NameLength1, ))
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(, NameLength2, ))
+   if (!makeNulTerminated(, NameLength2, ))
goto failure;
if (UserName) {
if (!*UserName) {
@@ -340,7 +338,7 @@ MNDBConnect(ODBCDbc *dbc,
goto failure;
}
 
-   if (!make_nul_terminated(, NameLength3, ))
+   if (!makeNulTerminated(, NameLength3, ))
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 = 0, *database = 0;
-   int port = 0, mapToLongVarchar = 0;
-   SQLRETURN rc;
-   int n;
+   (void) 

MonetDB: odbc-tls - allow_alt_name

2024-05-17 Thread Joeri van Ruth via checkin-list
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 = _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 - Extract MNDBConnectSettings

2024-05-17 Thread Joeri van Ruth via checkin-list
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 - Move all odbc parameters into msettings

2024-05-17 Thread Joeri van Ruth via checkin-list
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(>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"
 #include 

MonetDB: odbc-tls - Add MP_MAPTOLONGVARCHAR to msettings

2024-05-17 Thread Joeri van Ruth via checkin-list
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 - Add MP_LOGFILE setting

2024-05-17 Thread Joeri van Ruth via checkin-list
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 - unix_sock_name_buffer can be NULL

2024-05-17 Thread Joeri van Ruth via checkin-list
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 - Introduce setODBCdebug to simplify code

2024-05-17 Thread Joeri van Ruth via checkin-list
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 = 

MonetDB: odbc-tls - Turn ODBCLOG into a static inline function

2024-05-17 Thread Joeri van Ruth via checkin-list
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 

MonetDB: odbc-tls - Add a test program for SQLBrowseConnect

2024-05-17 Thread Joeri van Ruth via checkin-list
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, , msg, sizeof(msg), 
)) {
+   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, );
+   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, );
+   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, _size);
+   if (ret == SQL_NEED_DATA) {
+   if (required_size > prompt_size - 1) {
+   fprintf(stderr, "Please ask a wizard to enlarge me");
+   exit_code 

MonetDB: default - Approve tests.

2024-05-17 Thread Sjoerd Mullender via checkin-list
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: default - Don't make output BAT too large.

2024-05-17 Thread Sjoerd Mullender via checkin-list
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 - Don't shadow variable.

2024-05-17 Thread Sjoerd Mullender via checkin-list
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