Added the monetdbe library to the Windows installer.
MonetDB Common
A bug that would very occasionally produce an error "strPut: incorrectly encoded UTF-8", even when no incorrectly coded characters are used at all, has been fixed. It was the result of a rare combination of strings having been added to the column that caused essentially an off-by-one type of error to occur.
SQL Frontend
A bug where a sequence of TRUNCATE TABLE and COPY INTO the just truncated table would result in success being reported to both queries, but the table still being empty afterwards, has been fixed.
Merovingian
When stopping monetdbd using the 'monetdbd stop' command, this command now waits for 5 seconds longer than the exittimeout value before it kills the monetdbd daemon instead of only 30 seconds total (or until that daemon stops earlier). This gives the daemon enough time to terminate the mserver5 processes that it is managing. If exittimeout is negative, the daemon and the monetdbd process initiating the stop wait indefinitely until the mserver5 processes have stopped.
Bug Fixes
3336: DB files not removed if all rows are deleted, even after restart
7104: Monetdbe NTILE function does not produce correct ordering
7110: Monetdb Query parsing consistency issues in the latest release (Remote Table)
Oct2020-SP4 Bugfix Release (11.39.15)
ODBC Driver
When connecting using a DSN (Data Source Name), information about the data source is retrieved from the ODBC.INI file. Now we also get the location of the LOGFILE from this file. The logfile can be used to log all calls to the MonetDB ODBC driver to a file which can be used for debugging.
The ODBC driver now only passes on information about HUGEINT columns as HUGEINT when the application has indicated interest by querying about the SQL_HUGEINT extension type using the SQLGetTypeInfo function or by specifying the type in a call to SQLSetDescField. Otherwise the driver silently translates the HUGEINT type to BIGINT. This means that most application will see BIGINT columns when the server produced a HUGEINT column and only give an error if the value in the HUGEINT column didn't fit into a BIGINT.
Bug Fixes
6786: function json.isvalid(js json) is not useful, could be removed
7016: Database crashes when use similarity function on a table with more than 200k records
7037: Clearer err msg for ALTER USER with insufficient privileges
7042: AddressSanitizer:DEADLYSIGNAL in Oct2020/gdk/gdk_tracer.c:494
CREATE [OR REPLACE] TRIGGER schema_name.trigger_name is now disallowed, because the trigger will be stored on the same schema as the table it refers to. Use a schema-qualified on the table reference (ie ON clause) when necessary.
Bug Fixes
6862: mserver5: crashes under update_table() when calling lib_sql.so ( max_clients = 2048)
7001: crossproduct generated for a simple (semi-)join
7003: Segfault on large chain of constant decimal multiplication
7005: Dropping a STREAM TABLE does not remove the associated column info from sys._columns
7010: deallocate results in all prepared statements being deallocated (not error-related)
7011: uuid() called only once when used in projection list
Oct2020 feature release (11.39.5)
MonetDB5 Server
The settings for specifying how mserver5 should listen to "The Internet" have been overhauled. See the manual for details. In brief, mapi_autosense, mapi_ipv6 and mapi_open are gone. If mapi_listenaddr equals "localhost" or "all", we listen to both IPv4 and IPv6 (if available), if "127.0.0.1" or "0.0.0.0", we listen to IPv4 only, if "::1" or "::" we listen to IPv6 only. The first of each pair is loopback interface only, the second is all interfaces. If mapi_listenaddr is "none", then no IP port is opened, you need to use a UNIX domain socket. If mapi_port is 0, we let the operating system choose a free port (like mapi_autosense). Default behavior has not changed.
Whole System
Finished a first version of the new monitoring function user_statistics(), which is only intended for the DBAs. For each database user who has logged in during the current mserver5 session, it returns "username": login name of the database user, "querycount": the number of queries this user has executed since his/her first login, "totalticks": the total execution time (in microsecond) of the queries ran by this user, "maxquery": the query with the longest execution time (if two queries have the same execution time, the newer overwrites the older), "maxticks": the execution time of the 'maxquery' (in microsecond), "started": the start timestamp of the 'maxquery', "finished": the finish timestamp of the 'maxquery'.
Removed support for LiDAR data, that is the SQL procedures sys.lidarattach, sys.lidarload, and sys.lidarexport.
The sys.queue() has been turned into a circular buffer to allow for inspection of both active, paused and recently executed queries.
Client Package
mclient and msqldump now also look in $XDG_CONFIG_HOME for the monetdb configuration file.
SQL Frontend
Extended the system monitor with a table-returning function user_statistics() which keeps some statistics for each SQL user, e.g. the user's query count, total time spent, and maximal query seen.
Removed '@' syntax used to refer into a variable in a query. It was a non-standard method, which was replaced by a schema addition to variables. Variables in the global scope now have schema. All default global variables are set under schema "sys". However variables inside PSM don't have a schema, because there are no transaction semantics inside PSM at the moment.
Removed declared variables and tables from the global scope. They were transaction agnostic and incompatible with the SQL standard, i.e. they are valid exclusively under PSM (e.g. functions, procedures and triggers).
Scoping semantics were added for both variables and tables. Variables with the same name at a query are now resolved under the following precedence rules: 1. Tables, Views and CTEs at the FROM clause. 2. Variable declared in the body of function/procedure, i.e. local variable. 3. Function/procedure parameter. 4. Variable from the global scope. Tables with the same name now have the following precedence rules at a SQL query: 1. Table declared in the body of function/procedure, ie local table. 2. Temporary table. 3. Table from the current session schema. This means the query: SELECT * FROM "keys"; will list keys from temporary tables instead of persisted ones, because "keys" table is available for both "sys" and "tmp" schemas.
The table returning function "var" was extended with more details about globally declared variables, namely their schema, type and current value.
Removed obsolete sys.getContent(url) function.
Removed obsolete json.output(json) function.
Removed compatibility between interval types and other numeric types in favor for a more strict SQL standard compliance. This means operations between temporal types and other numeric types such as INT and DECIMAL are no longer possible, instead use interval types. e.g. SELECT date '2020-01-01' + 1; now gives the error. Instead do: SELECT date '2020-01-01' + interval '1' day; if 1 was meant to be a day interval. Setting an interval variable such as the session's current timezone with a number e.g. SET current_timezone = 1; is no longer possible. Instead do SET current_timezone = interval '1' hour; Casting between interval and other numeric types is no longer possible as well, because they are not compatible.
Because of incompatibilities this change may create, if a user intends to convert a numeric value to an interval, the multiplication function can be used in the form: * interval '1' e.g. 10 * interval '1' second = interval '10' second. As for the other way around, the 'EPOCH' option was added to the extract syntax. This option returns the number of milliseconds since the UNIX epoch 1970-01-01 00:00:00 UTC for date, timestamp and time values (it can be negative). Meanwhile, for day and second intervals, it returns the total number of milliseconds in the interval. As a side note, the 'EPOCH' option is not available for month intervals, because this conversion is not transparent for this type.
Made general logarithm function log(x,base) compliant with the SQL standard, by swapping the input parameters. Instead of log(x,base), now is log(base,x).