MonetDB: default - merged with aug2024

2024-07-14 Thread Niels Nes via checkin-list
Changeset: b62cf00a4142 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b62cf00a4142
Modified Files:
clients/Tests/exports.stable.out
sql/backends/monet5/sql.c
Branch: default
Log Message:

merged with aug2024


diffs (truncated from 780 to 300 lines):

diff --git a/CMakeLists.txt b/CMakeLists.txt
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -182,6 +182,11 @@ install(FILES
   DESTINATION ${EXPORT_TARGET_PATH}
   COMPONENT monetdbdev)
 
+install(FILES
+  ${CMAKE_CURRENT_BINARY_DIR}/MonetDBConfigVersion.cmake
+  DESTINATION ${EXPORT_TARGET_PATH}
+  COMPONENT monetdbdev)
+
 include(monetdb-packages)
 
 include(CTest)
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
@@ -790,7 +790,6 @@ str AUTHunlockVault(const char *password
 str AUTHverifyPassword(const char *passwd);
 str BKCmirror(bat *ret, const bat *bid);
 str BKCnewBAT(bat *res, const int *tt, const BUN *cap, role_t role);
-str CLTsessions(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
 str CLTshutdown(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
 str COPYrejects(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
 str COPYrejects_clear(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
@@ -1022,6 +1021,7 @@ int getOidConstant(MalBlkPtr mb, oid val
 int getPC(MalBlkPtr mb, InstrPtr p);
 str getPipeCatalog(bat *nme, bat *def, bat *stat);
 const char *getRef;
+str getScenarioLanguage(Client c);
 int getShtConstant(MalBlkPtr mb, sht val);
 int getStrConstant(MalBlkPtr mb, str val);
 const char *getTraceRef;
diff --git a/monetdb5/mal/mal_scenario.h b/monetdb5/mal/mal_scenario.h
--- a/monetdb5/mal/mal_scenario.h
+++ b/monetdb5/mal/mal_scenario.h
@@ -37,11 +37,11 @@ typedef struct SCENARIO {
 
 mal_export Scenario getFreeScenario(void);
 mal_export Scenario findScenario(const char *nme);
+mal_export str getScenarioLanguage(Client c);
 
 #ifdef LIBMONETDB5
 extern str setScenario(Client c, const char *nme);
 extern str runScenario(Client c);
-extern str getScenarioLanguage(Client c);
 
 extern void showCurrentScenario(void);
 extern void showScenarioByName(stream *f, const char *s);
diff --git a/monetdb5/modules/mal/clients.c b/monetdb5/modules/mal/clients.c
--- a/monetdb5/modules/mal/clients.c
+++ b/monetdb5/modules/mal/clients.c
@@ -773,214 +773,6 @@ CLTshutdown(Client cntxt, MalBlkPtr mb, 
return MAL_SUCCEED;
 }
 
-str
-CLTsessions(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
-{
-   BAT *id = NULL, *user = NULL, *login = NULL, *sessiontimeout = NULL,
-   *querytimeout = NULL, *idle = NULL;
-   BAT *opt = NULL, *wlimit = NULL, *mlimit = NULL;
-   BAT *language = NULL, *peer = NULL, *hostname = NULL, *application = 
NULL, *client = NULL, *clientpid = NULL, *remark = NULL;
-   bat *idId = getArgReference_bat(stk, pci, 0);
-   bat *userId = getArgReference_bat(stk, pci, 1);
-   bat *loginId = getArgReference_bat(stk, pci, 2);
-   bat *idleId = getArgReference_bat(stk, pci, 3);
-   bat *optId = getArgReference_bat(stk, pci, 4);
-   bat *sessiontimeoutId = getArgReference_bat(stk, pci, 5);
-   bat *querytimeoutId = getArgReference_bat(stk, pci, 6);
-   bat *wlimitId = getArgReference_bat(stk, pci, 7);
-   bat *mlimitId = getArgReference_bat(stk, pci, 8);
-   bat *languageId = getArgReference_bat(stk, pci, 9);
-   bat *peerId = getArgReference_bat(stk, pci, 10);
-   bat *hostnameId = getArgReference_bat(stk, pci, 11);
-   bat *applicationId = getArgReference_bat(stk, pci, 12);
-   bat *clientId = getArgReference_bat(stk, pci, 13);
-   bat *clientpidId = getArgReference_bat(stk, pci, 14);
-   bat *remarkId = getArgReference_bat(stk, pci, 15);
-   Client c;
-   bool admin;
-   timestamp ts;
-   lng pid;
-   const char *s;
-   int timeout;
-   str msg = NULL;
-
-   (void) cntxt;
-   (void) mb;
-
-   id = COLnew(0, TYPE_int, 0, TRANSIENT);
-   user = COLnew(0, TYPE_str, 0, TRANSIENT);
-   login = COLnew(0, TYPE_timestamp, 0, TRANSIENT);
-   opt = COLnew(0, TYPE_str, 0, TRANSIENT);
-   sessiontimeout = COLnew(0, TYPE_int, 0, TRANSIENT);
-   querytimeout = COLnew(0, TYPE_int, 0, TRANSIENT);
-   wlimit = COLnew(0, TYPE_int, 0, TRANSIENT);
-   mlimit = COLnew(0, TYPE_int, 0, TRANSIENT);
-   idle = COLnew(0, TYPE_timestamp, 0, TRANSIENT);
-   language = COLnew(0, TYPE_str, 0, TRANSIENT);
-   peer = COLnew(0, TYPE_str, 0, TRANSIENT);
-   hostname = COLnew(0, TYPE_str, 0, TRANSIENT);
-   application = COLnew(0, TYPE_str, 0, TRANSIENT);
-   client = COLnew(0, TYPE_str, 0, TRANSIENT);
-   clientpid = COLnew(0, TYPE_lng, 0, TRANSIENT);
-   remark = COLnew(0, TYPE_str, 0, TRANSIENT);
-
-   if (id == NULL || user == NULL || login == NULL || sessiontimeout == 
NULL
-   || idle == NULL || 

MonetDB: default - merged with Aug2024

2024-07-10 Thread Niels Nes via checkin-list
Changeset: 2cc06379d80e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/2cc06379d80e
Modified Files:
clients/Tests/exports.stable.out
Branch: default
Log Message:

merged with Aug2024


diffs (101 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
@@ -1065,6 +1065,7 @@ const char *likeRef;
 const char *likejoinRef;
 const char *likeselectRef;
 const char *likeuselectRef;
+const char *lngRef;
 str loadLibrary(const char *modulename, int flag);
 char *locate_file(const char *basename, const char *ext, bit recurse);
 const char *lockRef;
diff --git a/monetdb5/optimizer/opt_prelude.c b/monetdb5/optimizer/opt_prelude.c
--- a/monetdb5/optimizer/opt_prelude.c
+++ b/monetdb5/optimizer/opt_prelude.c
@@ -149,6 +149,7 @@ const char *leftjoinRef;
 const char *likejoinRef;
 const char *likeRef;
 const char *likeselectRef;
+const char *lngRef;
 const char *lockRef;
 const char *lookupRef;
 const char *malRef;
@@ -409,6 +410,7 @@ optimizerInit(void)
likejoinRef = putName("likejoin");
likeRef = putName("like");
likeselectRef = putName("likeselect");
+   lngRef = putName("lng");
lockRef = putName("lock");
lookupRef = putName("lookup");
malRef = putName("mal");
diff --git a/monetdb5/optimizer/opt_prelude.h b/monetdb5/optimizer/opt_prelude.h
--- a/monetdb5/optimizer/opt_prelude.h
+++ b/monetdb5/optimizer/opt_prelude.h
@@ -147,6 +147,7 @@ mal_export const char *likejoinRef;
 mal_export const char *likeRef;
 mal_export const char *likeselectRef;
 mal_export const char *likeuselectRef;
+mal_export const char *lngRef;
 mal_export const char *lockRef;
 mal_export const char *lookupRef;
 mal_export const char *malRef;
diff --git a/monetdb5/optimizer/opt_remap.c b/monetdb5/optimizer/opt_remap.c
--- a/monetdb5/optimizer/opt_remap.c
+++ b/monetdb5/optimizer/opt_remap.c
@@ -21,6 +21,21 @@
 #include "opt_inline.h"
 #include "opt_multiplex.h"
 
+static InstrPtr
+pushNilAt(MalBlkPtr mb, InstrPtr p, int pos)
+{
+int i;
+
+p = pushNilBat(mb, p);   /* push at end */
+if (mb->errors == NULL) {
+   int arg = getArg(p, p->argc - 1);
+for (i = p->argc - 1; i > pos; i--)
+getArg(p, i) = getArg(p, i - 1);
+getArg(p, pos) = arg;
+}
+return p;
+}
+
 static int
 OPTremapDirect(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, int 
idx,
   Module scope)
@@ -261,11 +276,16 @@ OPTmultiplexInline(Client cntxt, MalBlkP
q->typeresolved = false;
if (q->retc == 1 &&
((getModuleId(q) == batcalcRef
- && (getFunctionId(q) == mulRef
- || getFunctionId(q) 
== divRef
- || getFunctionId(q) 
== plusRef
- || getFunctionId(q) 
== minusRef
- || getFunctionId(q) 
== modRef))
+ && (   getFunctionId(q) == 
mulRef
+  || getFunctionId(q) 
== divRef
+  || getFunctionId(q) 
== plusRef
+  || getFunctionId(q) 
== minusRef
+  || getFunctionId(q) 
== modRef
+  || (q->argc > 3 && (
+
getFunctionId(q) == intRef
+ || 
getFunctionId(q) == lngRef
+ || 
getFunctionId(q) == hgeRef))
+))
 || getModuleId(q) == 
batmtimeRef
 || getModuleId(q) == 
batstrRef)) {
if (q->argc == 3 &&
@@ -292,6 +312,12 @@ OPTmultiplexInline(Client cntxt, MalBlkP
if 
(isaBatType(getArgType(mq, q, 2)))
q = 
pushNilBat(mq, q);
q = pushArgument(mq, q, 
a);
+   } else if (q->argc == 5 && 
getModuleId(q) == batcalcRef) { /* decimal casts */
+   int pos = 3;
+   if 
(isaBatType(getArgType(mq, q, 1)))
+ 

MonetDB: default - merged with Aug2024

2024-06-19 Thread Niels Nes via checkin-list
Changeset: d78523603c5f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d78523603c5f
Branch: default
Log Message:

merged with Aug2024


diffs (28 lines):

diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -2176,7 +2176,7 @@ BBPinit(bool allow_hge_upgrade)
}
}
 
-   if (MT_create_thread(, BBPmanager, NULL, MT_THR_DETACHED, 
"BBPmanager") < 0) {
+   if (!GDKinmemory(0) && MT_create_thread(, BBPmanager, NULL, 
MT_THR_DETACHED, "BBPmanager") < 0) {
TRC_CRITICAL(GDK, "Could not start BBPmanager thread.");
return GDK_FAIL;
}
diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -643,9 +643,9 @@ tc_commit_objectversion(sql_trans *tr, s
(void)oldest;
if (!tr->parent)
change->obj->new = 0;
-   ATOMIC_INC(>cat->schema_version);
-   }
-   else {
+   if (!ov->os->temporary)
+   ATOMIC_INC(>cat->schema_version);
+   } else {
os_rollback(ov, tr->store);
}
 
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: default - merged with aug2024

2024-06-11 Thread Niels Nes via checkin-list
Changeset: 24f8685ce20c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/24f8685ce20c
Modified Files:
sql/server/rel_select.c
Branch: default
Log Message:

merged with aug2024


diffs (71 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
@@ -2842,8 +2842,10 @@ rel_logical_exp(sql_query *query, sql_re
assert(quantifier == 0 || quantifier == 1 || quantifier == 2 || 
quantifier == 3 || quantifier == 4);
 
if (quantifier >= 3) {
-   if (quantifier == 4)
+   if (quantifier == 4) {
is_distinct_from = true;
+   compare_op = "<>";
+   }
quantifier = 0;
is_semantics = 1;
}
@@ -2859,6 +2861,7 @@ rel_logical_exp(sql_query *query, sql_re
bool rs_is_non_null_atom = exp_is_atom(rs) && 
exp_is_not_null(rs);
 
if (ls_is_non_null_atom || rs_is_non_null_atom) {
+   sql_rel *r = rel_dup(rel);
sql_rel* l = rel_compare(query, rel, sc, lo, 
ro, compare_op, f | sql_or, ek, quantifier, 0);
sql_subtype *t;
if (!(t = 
exp_subtype(rs_is_non_null_atom?ls:rs)))
@@ -2866,9 +2869,10 @@ rel_logical_exp(sql_query *query, sql_re
sql_exp* e = exp_compare(sql->sa, 
rs_is_non_null_atom?ls:rs, exp_atom(sql->sa, atom_general(sql->sa, t, NULL, 
0)), cmp_equal);
set_has_no_nil(e);
set_semantics(e);
-   sql_rel* r = 
rel_select_push_compare_exp_down(sql, rel, e, e->l, e->r, NULL, f | sql_or);
-
-   return rel_or(sql, rel_dup(rel), l, r, NULL, 
NULL, NULL);
+
+   r = rel_select_push_compare_exp_down(sql, r, e, 
e->l, e->r, NULL, f | sql_or);
+
+   return rel_or(sql, rel, l, r, NULL, NULL, NULL);
}
}
 
diff --git a/sql/test/BugTracker-2024/Tests/7534-is-distinct-from.test 
b/sql/test/BugTracker-2024/Tests/7534-is-distinct-from.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2024/Tests/7534-is-distinct-from.test
@@ -0,0 +1,20 @@
+statement ok
+CREATE TABLE t0(c0 VARCHAR)
+
+statement ok
+INSERT INTO t0 (c0) VALUES ('a');
+
+query T
+SELECT t0.c0 FROM t0
+
+a
+
+query T
+SELECT (1 AND ('' IS DISTINCT FROM t0.c0)) FROM t0
+
+True
+
+query T
+SELECT t0.c0 FROM t0 WHERE (1 AND ('' IS DISTINCT FROM t0.c0))
+
+a
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
@@ -61,4 +61,5 @@ 7513-uri-authority-parse-issue
 7514-wrong-window-function
 7524-right-outer-join
 7528-jarowinkler-null
+7534-is-distinct-from
 7535-create-view-groupby-func
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: default - merged with aug2024

2024-06-07 Thread Niels Nes via checkin-list
Changeset: d48164e0e4d4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d48164e0e4d4
Modified Files:
sql/server/rel_select.c
Branch: default
Log Message:

merged with aug2024


diffs (32 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
@@ -1337,9 +1337,8 @@ bool group_by_pk_project_uk_cond(mvc* sq
if (pki && pki->columns->cnt == 1 && inner->r && ((list*) 
inner->r)->cnt == 1) {
/* for now only check simple case where primary key and 
group by expression is a single column*/
sql_exp* gbe = ((list*) inner->r)->h->data;
-   assert(gbe->type == e_column);
sql_column* pkc = ((sql_kc *)pki->columns->h->data)->c;
-   if (strcmp(gbe->alias.name, pkc->base.name) == 0) {
+   if (gbe->type == e_column && strcmp(gbe->alias.name, 
pkc->base.name) == 0) {
node *n;
for (n = ukil->h; n; n = n->next){
sql_idx* uki = n->data;
diff --git a/sql/test/BugTracker-2024/Tests/7535-create-view-groupby-func.test 
b/sql/test/BugTracker-2024/Tests/7535-create-view-groupby-func.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2024/Tests/7535-create-view-groupby-func.test
@@ -0,0 +1,5 @@
+statement ok
+CREATE TABLE t0(c0 VARCHAR, c1 INTEGER, PRIMARY KEY(c0))
+
+statement error 42000!SELECT: cannot use non GROUP BY column 't0.c0' in query 
results without an aggregate function
+CREATE VIEW v0(c0) AS SELECT ('a'||t0.c0) FROM t0 GROUP BY (CASE t0.c1 WHEN 
t0.c1 THEN 'a' END )
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
@@ -61,3 +61,4 @@ 7513-uri-authority-parse-issue
 7514-wrong-window-function
 7524-right-outer-join
 7528-jarowinkler-null
+7535-create-view-groupby-func
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: default - merged with aug2024

2024-06-07 Thread Niels Nes via checkin-list
Changeset: a207071d3ec8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/a207071d3ec8
Modified Files:
sql/server/rel_dump.c
Branch: default
Log Message:

merged with aug2024


diffs (78 lines):

diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -2555,21 +2555,25 @@ exp2sql_dquoted(stream *fout, const char
 
 /* only simple expressions, ie recursive no psm */
 static void
-exp2sql_print(mvc *sql, stream *fout, sql_exp *e)
+exp2sql_print(mvc *sql, stream *fout, sql_exp *e, int depth)
 {
switch (e->type) {
case e_func: {
sql_subfunc *sf = e->f;
list *args = e->l;
if (list_length(args) == 2 && is_infix(sf->func)) {
-   exp2sql_print(sql, fout, args->h->data);
+   if (depth)
+   mnstr_printf(fout, "( " );
+   exp2sql_print(sql, fout, args->h->data, 
depth+1);
mnstr_printf(fout, " %s ", sf->func->base.name);
-   exp2sql_print(sql, fout, args->h->next->data);
+   exp2sql_print(sql, fout, args->h->next->data, 
depth+1);
+   if (depth)
+   mnstr_printf(fout, " )" );
} else {
exp2sql_dquoted(fout, NULL, 
sf->func->base.name, "(");
if (args)
for (node *n = args->h; n; n = n->next) 
{
-   exp2sql_print(sql, fout, 
n->data);
+   exp2sql_print(sql, fout, 
n->data, depth+1);
if (n->next)
mnstr_printf(fout, ", 
");
}
@@ -2581,7 +2585,7 @@ exp2sql_print(mvc *sql, stream *fout, sq
break;
case e_convert:
mnstr_printf(fout, "CAST (" );
-   exp2sql_print(sql, fout, e->l);
+   exp2sql_print(sql, fout, e->l, depth+1);
mnstr_printf(fout, "AS %s)", 
sql_subtype_string(sql->sa, exp_subtype(e)));
break;
case e_atom:
@@ -2609,7 +2613,7 @@ exp2sql( mvc *sql, sql_exp *exp)
if(s == NULL)
goto cleanup;
 
-   exp2sql_print(sql, s, exp);
+   exp2sql_print(sql, s, exp, 0);
 
res = buffer_get_buf(b);
 
diff --git a/sql/test/subquery/Tests/subquery3.test 
b/sql/test/subquery/Tests/subquery3.test
--- a/sql/test/subquery/Tests/subquery3.test
+++ b/sql/test/subquery/Tests/subquery3.test
@@ -624,19 +624,19 @@ query I rowsort
 SELECT col1 FROM another_T WHERE (col2, col3) IN (SELECT 1,2)
 
 
-statement error 42000!syntax error, unexpected sqlINT, expecting SELECT or '(' 
or VALUES or WITH in: "select (1,2) in (1"
+statement error 42000!
 SELECT (1,2) IN (1,2)
 
-statement error 42000!syntax error, unexpected sqlINT, expecting SELECT or '(' 
or VALUES or WITH in: "select (1,2) in (1"
+statement error 42000!
 SELECT (1,2) IN (1)
 
 statement error 42000!Subquery has too few columns
 SELECT (col1, col2) IN (VALUES (1)) FROM another_T
 
-statement error 42000!syntax error, unexpected sqlINT, expecting SELECT or '(' 
or VALUES or WITH in: "select (col1, col2) in (1"
+statement error 42000!
 SELECT (col1, col2) IN (1) FROM another_T
 
-statement error 42000!syntax error, unexpected sqlINT, expecting SELECT or '(' 
or VALUES or WITH in: "select col1 from another_t where (col2, col3) in (1"
+statement error 42000!
 SELECT col1 FROM another_T WHERE (col2, col3) IN (1,2,3)
 
 statement error 42000!Subquery has too few columns
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: default - merged with aug2024

2024-06-06 Thread Niels Nes via checkin-list
Changeset: acc24cd4639d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/acc24cd4639d
Modified Files:
MonetDB.spec
clients/odbc/winsetup/setup.rc
sql/backends/monet5/sql.c
Branch: default
Log Message:

merged with aug2024


diffs (truncated from 2480 to 300 lines):

diff --git a/.hgignore b/.hgignore
--- a/.hgignore
+++ b/.hgignore
@@ -44,6 +44,7 @@ GPATH
 GRTAGS
 TAGS
 tags
+cscope.*
 *.pyo
 *.rej
 *.orig
diff --git a/CMakeLists.txt b/CMakeLists.txt
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -118,8 +118,14 @@ if(WIN32)
 ${CMAKE_CURRENT_BINARY_DIR}/unistd.h)
 endif()
 
-add_library(monetdb_config_header
-  INTERFACE)
+add_library(monetdb_config_header INTERFACE)
+
+if (CTAGS_PATH)
+  add_dependencies(monetdb_config_header tags)
+endif()
+if (CSCOPE_PATH)
+  add_dependencies(monetdb_config_header cscope)
+endif()
 
 target_include_directories(monetdb_config_header
   INTERFACE
diff --git a/MonetDB.spec b/MonetDB.spec
--- a/MonetDB.spec
+++ b/MonetDB.spec
@@ -417,6 +417,7 @@ developer.
 %{_bindir}/arraytest
 %{_bindir}/bincopydata
 %{_bindir}/murltest
+%{_bindir}/odbcconnect
 %{_bindir}/odbcsample1
 %{_bindir}/sample0
 %{_bindir}/sample1
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
@@ -24,21 +24,21 @@
 #define IDC_EDIT_PORT   2006
 #define IDC_EDIT_DATABASE   2007
 
-// Advanced settings (new from Jun2024)
-#define IDC_EDIT_SCHEMA 2011
-#define IDC_EDIT_LOGINTIMEOUT   2012
-#define IDC_EDIT_REPLYTIMEOUT   2013
-#define IDC_EDIT_REPLYSIZE  2014
-#define IDC_EDIT_AUTOCOMMIT 2015
-#define IDC_EDIT_TIMEZONE   2016
-#define IDC_EDIT_LOGFILE2017
+// Secure connections using TLS
+#define IDC_EDIT_USETLS 2011
+#define IDC_EDIT_SERVERCERT 2012
+#define IDC_EDIT_SERVERCERTHASH 2013
+#define IDC_EDIT_CLIENTKEY  2014
+#define IDC_EDIT_CLIENTCERT 2015
 
-// Secure connections using TLS
-#define IDC_EDIT_USETLS 2021
-#define IDC_EDIT_SERVERCERT 2022
-#define IDC_EDIT_SERVERCERTHASH 2023
-#define IDC_EDIT_CLIENTKEY  2024
-#define IDC_EDIT_CLIENTCERT 2025
+// Advanced settings
+#define IDC_EDIT_SCHEMA 2021
+#define IDC_EDIT_LOGINTIMEOUT   2022
+#define IDC_EDIT_REPLYTIMEOUT   2023
+#define IDC_EDIT_REPLYSIZE  2024
+#define IDC_EDIT_AUTOCOMMIT 2025
+#define IDC_EDIT_TIMEZONE   2026
+#define IDC_EDIT_LOGFILE2027
 
 #define IDC_BUTTON_TEST 2031
 #define IDC_BUTTON_HELP 2032
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
@@ -154,6 +154,13 @@ 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 : "");
+   // Secure connections using TLS
+   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 : "");
+   // Advanced settings
SetDlgItemText(hwndDlg, IDC_EDIT_SCHEMA, datap->schema ? 
datap->schema : "");
SetDlgItemText(hwndDlg, IDC_EDIT_LOGINTIMEOUT, 
datap->logintimeout ? datap->logintimeout : "");
SetDlgItemText(hwndDlg, IDC_EDIT_REPLYTIMEOUT, 
datap->replytimeout ? datap->replytimeout : "");
@@ -161,11 +168,6 @@ DialogProc(HWND hwndDlg, UINT uMsg, WPAR
SetDlgItemText(hwndDlg, IDC_EDIT_AUTOCOMMIT, datap->autocommit 
? datap->autocommit : "on");
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 ?