Changeset: 272c586a7ca4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/272c586a7ca4
Modified Files:
sql/server/rel_select.c
sql/server/sql_parser.y
sql/storage/store.c
Branch: default
Log Message:
Merge with Aug2024
diffs (truncated from 1397 to 300 lines):
diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c
--- a/clients/mapiclient/mclient.c
+++ b/clients/mapiclient/mclient.c
@@ -3879,6 +3879,8 @@ main(int argc, char **argv)
}
mapi_destroy(mid);
+ if (toConsole != stdout_stream && toConsole != stderr_stream)
+ close_stream(toConsole);
mnstr_destroy(stdout_stream);
mnstr_destroy(stderr_stream);
if (priv.buf != NULL)
diff --git a/clients/mapiclient/mhelp.c b/clients/mapiclient/mhelp.c
--- a/clients/mapiclient/mhelp.c
+++ b/clients/mapiclient/mhelp.c
@@ -88,7 +88,7 @@ SQLhelp sqlhelp1[] = {
"ALTER USER ident\n"
" [WITH [ENCRYPTED | UNENCRYPTED] PASSWORD string]\n"
" [SET SCHEMA ident] [SCHEMA PATH string] [DEFAULT ROLE ident]\n"
- " [MAX_MEMORY posbytes | NO MAX_MEMORY] [MAX_WORKERS poscount | NO
MAX_WORKERS]",
+ " [MAX_MEMORY posbytes | MAX_MEMORY sizestr | NO MAX_MEMORY]
[MAX_WORKERS poscount | NO MAX_WORKERS]",
"ident",
"See also
https://www.monetdb.org/documentation/user-guide/sql-manual/data-definition/privileges/"},
{"ANALYZE",
@@ -252,7 +252,7 @@ SQLhelp sqlhelp1[] = {
{"CREATE USER",
"Create a new database user",
"CREATE USER ident WITH [ENCRYPTED | UNENCRYPTED] PASSWORD string NAME
string [SCHEMA ident] [SCHEMA PATH string]\n"
- "[MAX_MEMORY posbytes | NO MAX_MEMORY] [MAX_WORKERS poscount | NO
MAX_WORKERS]\n"
+ "[MAX_MEMORY posbytes | MAX_MEMORY sizestr | NO MAX_MEMORY]
[MAX_WORKERS poscount | NO MAX_WORKERS]\n"
"[OPTIMIZER string] [DEFAULT ROLE ident]",
"ident",
"See also
https://www.monetdb.org/documentation/user-guide/sql-manual/data-definition/privileges/"},
diff --git a/clients/mapilib/Tests/tlssecurity.py
b/clients/mapilib/Tests/tlssecurity.py
--- a/clients/mapilib/Tests/tlssecurity.py
+++ b/clients/mapilib/Tests/tlssecurity.py
@@ -14,10 +14,8 @@ import os
import re
import subprocess
import sys
-import threading
-sys.path.append(os.environ.get('TSTSRCDIR','.'))
-import tlstester
+from MonetDBtesting.tlstester import TLSTesterClient
level = logging.WARNING
# if sys.platform == 'win32':
@@ -27,45 +25,20 @@ if '-v' in sys.argv:
#level = logging.DEBUG
logging.basicConfig(level=level)
+# A tmpdir to write certificates to
tgtdir = os.environ['TSTTRGDIR']
assert os.path.isdir(tgtdir)
+scratchdir = os.path.join(tgtdir, "scratch")
+logging.debug(f"scratchdir={scratchdir}")
-hostnames = ['localhost']
-# Generate certificates and write them to the scratch dir
-# Write them to the scratch dir for inspection by the user.
-certs = tlstester.Certs(hostnames)
-certsdir = os.path.join(tgtdir, "certs")
-try:
- os.mkdir(certsdir)
-except FileExistsError:
- pass
-count = 0
-for name, content in certs.all().items():
- with open(os.path.join(certsdir, name), "wb") as a:
- a.write(content)
- count += 1
-logging.debug(f"Wrote {count} files to {certsdir}")
+tlstester = TLSTesterClient(scratchdir)
+
def certpath(name):
- return os.path.join(certsdir, name)
-def certbytes(name):
- filename = certpath(name)
- with open(filename, 'rb') as f:
- return f.read()
-
-# Start the worker threads
-
-server = tlstester.TLSTester(
- certs=certs,
- listen_addr='127.0.0.1',
- preassigned=dict(),
- sequential=False,
- hostnames=hostnames)
-server_thread = threading.Thread(target=server.serve_forever, daemon=True)
-server_thread.start()
+ return tlstester.download(name)
def attempt(experiment: str, portname: str, expected_error_regex: str,
tls=True, host='localhost', **params):
- port = server.get_port(portname)
+ port = tlstester.get_port(portname)
scheme = 'monetdbs' if tls else 'monetdb'
url = f"{scheme}://{host}:{port}/demo"
if params:
@@ -197,7 +170,7 @@ attempt('connect_server_name', 'sni', No
# Connect to port 'server1' over TLS, with certhash set to a prefix of the hash
# of the server certificate in DER form. Have a succesful MAPI exchange.
-server1hash = sha256(certs.get_file('server1.der')).hexdigest()
+server1hash = sha256(tlstester.fetch('server1.der')).hexdigest()
attempt('connect_right_hash', 'server1', None, certhash='sha256:' +
server1hash[:6])
# connect_wrong_hash
@@ -218,7 +191,7 @@ attempt('connect_wrong_hash', 'server1',
# Connect to port 'server1' over TLS, with certhash set to a prefix of the hash
# of the CA1 certificate in DER form. This should fail.
-ca1hash = sha256(certs.get_file('ca1.der')).hexdigest()
+ca1hash = sha256(tlstester.fetch('ca1.der')).hexdigest()
attempt('connect_ca_hash', 'server1', "does not match certhash",
certhash='sha256:' + ca1hash[:6])
diff --git a/clients/odbc/driver/ODBCError.c b/clients/odbc/driver/ODBCError.c
--- a/clients/odbc/driver/ODBCError.c
+++ b/clients/odbc/driver/ODBCError.c
@@ -373,27 +373,6 @@ appendODBCError(ODBCError **head, ODBCEr
}
-#if 0 /* unused */
-/*
- * Prepends a valid ODBCError object 'err' to the front of the list
- * of a valid ODBCError object 'head' and return the new head.
- *
- * Precondition: both head and err must be valid (non NULL)
- * Returns: the new head (which is the same as the prepended 'err').
- */
-void
-prependODBCError(ODBCError **head, ODBCError *err)
-{
- assert(head);
- assert(err);
- assert(err->next == NULL);
-
- err->next = *head;
- *head = err;
-}
-#endif
-
-
/*
* Frees the ODBCError object including its linked ODBCError objects.
*
diff --git a/clients/odbc/driver/ODBCError.h b/clients/odbc/driver/ODBCError.h
--- a/clients/odbc/driver/ODBCError.h
+++ b/clients/odbc/driver/ODBCError.h
@@ -110,18 +110,6 @@ int getErrorRecCount(ODBCError *error);
void appendODBCError(ODBCError **head, ODBCError *err);
-#if 0 /* unused */
-/*
- * Prepends a valid ODBCError object 'this' to the front of the list
- * of a valid ODBCError object 'head' and return the new head.
- *
- * Precondition: both head and this must be valid (non NULL)
- * Returns: the new head (which is the same as the prepended 'this').
- */
-void prependODBCError(ODBCError **head, ODBCError *err);
-#endif
-
-
/*
* Frees the ODBCError object including its linked ODBCError objects.
*
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
@@ -487,8 +487,12 @@ MNDBConnectSettings(ODBCDbc *dbc, const
mapi_reconnect(mid);
}
if (mid == NULL || mapi_error(mid)) {
- const char *error_state = "08001";
+ const char *error_state;
const char *error_explanation = mid ? mapi_error_str(mid) :
NULL;
+ if (error_explanation && strncmp(error_explanation,
"InvalidCredentialsException:", 28) == 0)
+ error_state = "28000";
+ else
+ error_state = "08001";
addDbcError(dbc, error_state, error_explanation, 0);
if (mid)
mapi_destroy(mid);
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,17 +26,9 @@ target_link_libraries(arraytest
PRIVATE
ODBC::ODBC)
-add_executable(odbcconnect
- odbcconnect.c)
-
-target_link_libraries(odbcconnect
- PRIVATE
- ODBC::ODBC)
-
install(TARGETS
odbcsample1
arraytest
- odbcconnect
RUNTIME
DESTINATION
${CMAKE_INSTALL_BINDIR}
@@ -46,7 +38,6 @@ if(WIN32)
install(FILES
$<TARGET_PDB_FILE:odbcsample1>
$<TARGET_PDB_FILE:arraytest>
- $<TARGET_PDB_FILE:odbcconnect>
DESTINATION ${CMAKE_INSTALL_BINDIR}
OPTIONAL)
endif()
diff --git a/clients/odbc/tests/CMakeLists.txt
b/clients/odbc/tests/CMakeLists.txt
--- a/clients/odbc/tests/CMakeLists.txt
+++ b/clients/odbc/tests/CMakeLists.txt
@@ -39,11 +39,19 @@ target_link_libraries(ODBCtester
PRIVATE
ODBC::ODBC)
+add_executable(odbcconnect
+ odbcconnect.c)
+
+target_link_libraries(odbcconnect
+ PRIVATE
+ ODBC::ODBC)
+
install(TARGETS
ODBCgetInfo
ODBCStmtAttr
ODBCmetadata
ODBCtester
+ odbcconnect
RUNTIME
DESTINATION
${CMAKE_INSTALL_BINDIR}
@@ -55,6 +63,7 @@ if(WIN32)
$<TARGET_PDB_FILE:ODBCStmtAttr>
$<TARGET_PDB_FILE:ODBCmetadata>
$<TARGET_PDB_FILE:ODBCtester>
+ $<TARGET_PDB_FILE:odbcconnect>
DESTINATION ${CMAKE_INSTALL_BINDIR}
OPTIONAL)
endif()
diff --git a/clients/odbc/samples/odbcconnect.c
b/clients/odbc/tests/odbcconnect.c
rename from clients/odbc/samples/odbcconnect.c
rename to clients/odbc/tests/odbcconnect.c
--- a/clients/odbc/samples/odbcconnect.c
+++ b/clients/odbc/tests/odbcconnect.c
@@ -15,6 +15,8 @@
#include <WTypes.h>
#endif
+
+#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
@@ -26,17 +28,24 @@ static const char *USAGE =
"Usage:\n"
" odbcconnect [-d | -c | -b ] [-v] [-u USER] [-p PASSWORD]
TARGET..\n"
"Options:\n"
- " -d Target is DSN, call SQLConnect()\n"
- " -c Target is connection string, call
SQLDriverConnect()\n"
+ " -d Target is connection string, call
SQLDriverConnect()\n"
" -b Target is connection string, call
SQLBrowseConnect()\n"
+ " -l List registered drivers and data sources\n"
" -u USER\n"
" -p PASSWORD\n"
" -v Be verbose\n"
- " TARGET Connection String or DSN\n";
+ " TARGET DSN or with -d and -b, Connection String\n";
+
+typedef int (action_t)(SQLCHAR *);
+
+static int do_actions(action_t action, int ntargets, SQLCHAR **targets);
-static int do_sqlconnect(SQLCHAR *target);
-static int do_sqldriverconnect(SQLCHAR *target);
-static int do_sqlbrowseconnect(SQLCHAR *target);
+static action_t do_sqlconnect;
+static action_t do_sqldriverconnect;
+static action_t do_sqlbrowseconnect;
+
+static int do_listdrivers(void);
+static int do_listdsns(const char *prefix, SQLSMALLINT dir);
static void ensure_ok(SQLSMALLINT type, SQLHANDLE handle, const char *message,
SQLRETURN ret);
@@ -49,6 +58,7 @@ SQLHANDLE env = NULL;
SQLHANDLE conn = NULL;
SQLCHAR outbuf[4096];
+SQLCHAR attrbuf[4096];
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]