kdb+ 4.1 Release Notes¶
This page details the latest features and improvements released to kdb+ 4.1.
2026.10.02¶
New¶
- maximum reference count is now ~4billion (was ~2billion).
Fixes and improvements¶
-
indexing into a list of which the first element is an unloaded table could seg-fault on exiting the debugger, e.g.
(enlist flipab!t)1 2` -
fixed crash when appending to an existing zstd compressed file, where none of the existing blocks in the file were compressed due to zstd not being able to reduce bytes from original size. Crash only occured when this was the first operation using zstd for a newly spawned instance.
2026.07.06¶
New¶
-
compression can be turned on or off for a given handle using .Q.ipc with 2 parameters of a handle and a dictionary. this enables or disables ipc compression for outgoing data.
-
the dictionary uses a key of symbol z for compression, with a boolean value to turn compression on or off e.g. .Q.ipc[h;([z:0b])] switches off compression for handle 'h'.
-
the standard compression rules still apply when compression enabled i.e. data should be >2000bytes and compress to less than half the size in order to be compressed
Fixes and improvements¶
-
since kdb+4.1 2021.03.30, in distributed (negative -s) peach mode, select, meta, update, etc erroneously used secondary processes to load columns of splayed/partitioned tables
-
anymap like enlist"*" threw 'type even if all elements were strings, e.g.
q)get[`:v set ("abc";"def")]like enlist"*" 11b -
"\n"$ was segfaulting, e.g.
q)"\n"$("123";"456") 'type -
partitioned functional select was stripping the sorted attribute from step dictionaries, e.g.
q)`:HDB/2026.02.10/test/ set([]time:0 2 4);system"l HDB";?[test;();0b;`time`bucket!(`time;(`s#1 3!`closed`open;`time))] time bucket ----------- 0 2 closed 4 open the profiler could leave the target in a stopped state when the latter read compressed data -
match could seg-fault on anymap & pre-3.6 mapped nested data, e.g.
q)(a;b):get`:foo set (1;0x0000)
2026.05.01¶
Fixes and improvements¶
-
computing average of more than 2147483647 rows from a partitioned table returned wrong result due to overflow since 3.3
q)(`:T/2000.01.01/t/;`:T/2000.01.02/t/) set\: ([]1073741824#1b) q)\l T/ q)select avg x from t raze now elides copy for both leading and trailing empty lists -
x*/y with byte or short x returned wrong result since kdb+3.3, e.g.
q)0x01*/0x01020304 q)1h*/1 2 3 4h consistently handle a&/`s#b and a|/`s#b which has been igoring seed for a nonempty array since 3.1 q)0&/`s#1 2 3
2026.04.01¶
New¶
-
Additional optional env variables for TLS connections (OpenSSL 1.1.0 and above required) :
-
KX_SSL_MINPROTOCOL sets the minimum supported protocol values are "SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2", "TLSv1.3" and "None" for no limit (default "TLSv1")
-
KX_SSL_MAXPROTOCOL sets the maximum supported protocol values are "SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2", "TLSv1.3" and "None" for no limit
-
KX_SSL_CIPHERSUITES sets the available ciphersuites for TLSv1.3 to value. This is a colon-separated list of TLSv1.3 ciphersuite names in order of preference. This list will be combined any configured TLSv1.2 (KX_SSL_CIPHER_LIST) For available ciphers on your system run 'openssl ciphers -s -tls1_3'
Fixes and improvements¶
-
Since 2025.11.25, .Q.bv when run on segmented table with a table missing from the same partition across segments would result in reduced memory. A side-effect was that it could increase runtime. Now altered to reduce runtime.
-
On Windows, error 'OS reports: Access is denied.' could occur when running with mutiple threads and memory mapping multiple compressed files of different sizes e.g. querying data across a partition
2026.01.23¶
New¶
-
windows license check includes an additional check of comparing with hostname.domainname where domainname is retrieved from the DNS associated with the local computer. linux/mac already perform this check.
-
this is in addition to the windows lookup of the host/domain via IP. Ref: https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getcomputernameexa (ComputerNameDnsDomain)
-
license error due to host mismatch now contains extra information (domain and dns) e.g. "'license error: host testbox" can now be presented in the style "'license error: host testbox.domain host.docker.internal)"
Fixes and improvements¶
- pressing Ctrl+C on Windows stopped the console from responding, since Windows 8
2025.12.18¶
Fixes and improvements¶
-
in very rare cases, sorting could hang, since 3.5
-
upserting a sorted column without `s# attribute to a sorted splayed column is now append when applicable
-
.q_ and .k_ files are now also loaded from db root when loading a database
2025.11.25¶
NUC (Not Upwardly Compatible)¶
Not backward compatible. Changes existing behavior.
-
user defined c code called from kdb+ (112 type) no longer called with altered subnormal registry flags that may have been changed from system default
-
assignment to if/do/while now blocked at parse time. previously could lead to seg-fault
q){ if[a;1 2]:3 4 } 'assign q)do:1 'assign
New¶
-
new alternative value for environment variable KX_SSL_VERIFY_SERVER is HOSTIP. Additional validation is used when a TLS/SSL connection is being
-
opened from a client. OpenSSL 1.0.2 and above is required.
-
When a hostname is used to connect via TLS/SSL, it checks if the server certificate Subject Alternative Name (SAN) or Subject CommonName (CN) matches the specified hostname (ref:X509_check_host).
-
When an IP is used to connect via TLS/SSL, checks if the certificate matches a specified IPv4 (ref:X509_check_ip). For example, connecting with 127.0.0.1 would required the following in the certificate:
X509v3 extensions: X509v3 Subject Alternative Name: IP Address:127.0.0.1 -
.Q.atob companion for existing Q.btoa. Decodes base64 data. Accepts char or byte vector, returns byte vector. Throws domain error if data not correctly padded.
q)10h$.Q.atob "aGVsbG8=" "hello" -
from the main thread (e.g. timer, console), hclose can close sockets used in other threads (e.g. when using multi-threaded input mode). Was possible prior to 4.1.
-
TLS/SSL now supported for IPC when using inted/xinetd (or systemd when using a service with StandardInput=socket), ref: https://code.kx.com/q/kb/inetd/
-
for binary HTTP responses .h.hn and .h.hy can now also accept byte vector (in addition to char vector) for data content e.g.
q).h.hn["200 OK";`jpg;read1`$":test.jpg"]
Fixes and improvements¶
-
When HTTP basic auth provided with non-padded base64 encoded data, default basic auth handling via .z.ac would truncate the data.
-
e.g. (`$":http://127.0.0.1:5000")"GET / HTTP/1.1\r\nAuthorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ\r\n\r\n" (user:Aladdin,pass:"open sesam"). Now defaults to empty user/pass. Correct padded request would be
-
(
$":http://127.0.0.1:5000")"GET / HTTP/1.1\r\nAuthorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==\r\n\r\n" (user:Aladdin,pass:"open sesame") -
When HTTP basic auth provided with base64 incorrectly encoded data with multple padding ('=') characters, the server could be corrupted or crash.
-
When HTTP basic auth used, HTTP .z namespace callbacks would be called with corrupted data in the 'Authorization' header, when .z.ac set to return (4;""). This is the default action when .z.ac not defined. The
-
base64 decoded username/password would appear in the HTTP data, with additional trailing characters. Now does not alter the HTTP payload provided. .z.pw is still called with decoded username/password.
-
When running .Q.bv against a multi-segmented table, with a table missing from the same partition across segments, could result duplicate entries in .Q.vt. Now checks for duplicates for reduction in memory.
-
pattern matching symbol vector literals could seg-fault
q){`a`b : x}`c`d profiler could sometimes seg-fault on mac os, when using threads the process could exit with an 'illegal instruction' error prior to the stack space protection q error 'stack q){v:(([]a:1 2);enlist(in;`a;(?;(`v;0);(`v;1);0b;(`v;2)));enlist[`a]!enlist `a);?[v 0;v 1;0b;v 2]}peach(::;::) Illegal instruction: 4 now produces q){v:(([]a:1 2);enlist(in;`a;(?;(`v;0);(`v;1);0b;(`v;2)));enlist[`a]!enlist `a);?[v 0;v 1;0b;v 2]}peach(::;::) 'stack -
Windows specific fix for mapped ragged splays which could leak memory. The following example situation was fixed
q)`:ragged/.d set`x`a; q)`:ragged/x set 1 2; q)`:ragged/a set 1993#(1 2;3 4); q)select from `:ragged/;.Q.w[]`mmap
2025.07.09¶
Fixes and improvements¶
- TLS/SSL session resumption would error on server instance with SSL_VERIFY_CLIENT enabled
2025.04.28¶
Fixes and improvements¶
-
client side ipc connection would hang if username was an uppercase HTTP method (e.g. "GET")
-
if a user defined .z.ps was set prior to running -11! , then altered via a message in the log file, a crash could occur
-
if a message in a log file contained instructions to set a user defined .z.ps, this wouldnt be applied to subsequent messages from the log file when using -11!
-
mtprims during file writing (e.g. indexing) were always suppressed since 4.1 2024.09.20, leading to performance regression compared to 4.0, e.g. in
sym xasc:t -
compressed set within peach could signal 'Cannot perform new zip until last zip operation in this thread completed, since 4.1
-
loading with .Q.li reuses any previous cached counts for partitioned tables for existing partitions.
2025.02.18¶
Fixes and improvements¶
-
since 2.7 2011.11.18, drop (_) on a partitioned or non existent splayed table could crash e.g.
q)@[flip[`a`b!`:foobar]_;0;::] -
since 4.1 2025.01.17, .Q.enxs (and derivative functions such as .Q.dptfs) would throw an error when passed an empty table.
-
since 4.1 2023.03.01, when using object storage db would fail to reload when using \l
-
top-level peach could fail to allocate upfront small packets of work among the threads, since 4.1, e.g. this could be incorrect (ran on fewer threads than \s):
q){.Q.w[]}peach til system"s" -
since 4.0 2023.01.20, .Q.ld could erroneously modify it's input, e.g.
q)lines:("aaa ";"bbb");.Q.ld lines;lines "aaa" "bbb"
2025.01.31¶
Fixes and improvements¶
-
since 4.1 2025.01.17, after running .Q.MAP, certain queries on partitioned tables could error with length e.g.
q)select i from t where i=0,{x=0}[i] calling hclose[.z.w] within .z.pg could cause corruption
2025.01.17¶
New¶
-
.Q.enxs (and derivative functions en, enx, ens) accept directory argument (::) to prevent on-disk read/write e.g.
q).Q.enxs[$;::;t;`sym] q).Q.en[::;t] / user should ensure on-disk file kept in sync with in-memory enum domain -
for queries on partitioned tables in segmented databases, use secondary threads if available on each segment and partition, previously parallelism was only at the segment level.
-
for queries on partitioned tables in segmented databases, delay materializing results when results exist only in one segment for a table.
Fixes and improvements¶
-
running kdb+ in a windows debugger could throw an unknown signal on startup
-
crash could occur if http callbacks contained code to close the receiving socket.
q)\p 5000 q).z.ac:{[x]hclose .z.w;(2;"HTTP/1.1 401 Unauthorized\r\nConnection: close\r\n\r\n")} client: q)`:http://localhost:5000 "GET / HTTP/1.1\r\n\r\n" see documentation for .z.ac, returning appropriate response will close the socket automatically .Q.res now includes `from`by -
crash could occur due to a system error (e.g. insufficient memory, system file descriptor limit) when altering the event queue
-
appending vectors or tables to type 0 lists with `g# attribute could seg-fault, e.g.
q)a:`g#1#(::);a,:100#`s q)a:`g#1 1#(::);a,:100#([]`a`b`c) since 4.1t 2023.01.20, for guid vectors, on-disk amend to apply `p# or `g# was writing down attribute data incorrectly, leading to failed lookups q)`:a0 set a:"G"$("8462c71d-bb02-9094-7f17-dcff70120905";"746906b1-50b1-4dfe-f665-700193516426") q).[`:a0;();`p#]; `:a1 set `p#a; (read1`:a0)~read1`:a1 q)1=count select from ([]get`:a0) where x=first a -
since 4.1 2024.09.13, after running .Q.MAP, queries on partitioned tables materialized the partition column (e.g. date) causing a performance penalty e.g.
q)`:/tmp/db/2001.01.01/t/ set 10000000#([]time:10?.z.P;price:10?10f;size:10?100) q)\l /tmp/db q)\ts:100 select time,price,size from t 9 2272 q).Q.MAP[] q)\ts:100 select time,price,size from t 206 67111120 / 4.1 2024.09.13
2024.10.16¶
Fixes and improvements¶
-
partitioning with value>max int could be populated with ni, now parses as long e.g. previously
q)set\:[;([]a:1 2)]sv'[`],'[;`].Q.par[`:hdb;;`t]@'`long$1e11*1+til 3 q)\l hdb q)select from t int a -------------- 100000000000 1 100000000000 2 200000000000 1 200000000000 2 300000000000 1 300000000000 2 q)select int,a from t int a ------------- -2147483648 1 -2147483648 2 -2147483648 1 -2147483648 2 -2147483648 1 -2147483648 2 mac performance improvement processing received async msgs -
performance improvement to .z.W and .z.H. Note that -38! can be used as an alternative to .z.W when handle(s) are known.
2024.09.20¶
Fixes and improvements¶
-
file writing within peach could seg-fault, since 4.1
-
.Q.li now accepts an atomic argument for a single partition
2024.09.13¶
New¶
-
.Q.id now supports dictionaries. same rules as for tables apply
q).Q.id[`b`b1``in!2 3 4 5]~([b:2;b1:3;a:4;in1:5]) -
added functions .Q.bvi and .Q.li for incremental reloads of hdbs.
.Q.bvi is .Q.bv but scans only new partitions loaded in the hdb since the last time .Q.bv or .Q.bvi was run. .Q.li[partitions] adds any partitions which are both in the list supplied and on disk in the current hdb, e.g. q)`:/tmp/db/2001.01.01/t/ set tt:.Q.en[`:/tmp/db]([]sym:10?`A`B`C;time:10?.z.T;price:10?10f) q)\l /tmp/db q)`:2001.01.02/t/`:2001.01.03/t/ set\:tt q)date ,2001.01.01 q).Q.li[2001.01.02];date
2001.01.01¶
Other changes¶
```q
q).Q.li[2001.01.02 2001.01.03];select count i by date from t
date | x
----------| --
2001.01.01| 10
2001.01.02| 10
2001.01.03| 10
```
Fixes and improvements¶
-
after calling .Q.MAP[], certain queries involving the partition field could result in a 'length error
q)select date,sym from trade 'length q)select by sym,date from trade 'length q)select from trade where sym=`AAA,date=.z.D 'length prevent implicit peach calls in partitioned database functions on negative (distributed) -s values 'select/exec .. where x within y' erroneously allowed atom y, functioning as 'where x=y'. now throws 'type q)"type"~@[value;"select from([]1 2)where x within 1";::]
2024.07.08¶
New¶
- return .z.H as sorted list of handles
Fixes and improvements¶
-
parse error within the column list of a delete expression could seg-fault, since 4.1t 2024.02.02 e.g.
q)delete a, from t q)delete .. a from t -
the n/m fields of -38! were swapped, since 2024.05.31
-
the z field of -38! incorrectly reported 1b for unix domain sockets, since 2024.05.31
0 wavg (1 2;3 4) would return scalar 0n, since 2021.09.03
2024.05.31¶
New¶
- the table returned by -38! has three new columns: z(compression enabled flag) n(count unsent msgs) m(total unsent bytes, like .z.W)
Fixes and improvements¶
-
for anymap objects written with 1:, prototype was erroneously computed to be (), leading to 'length error on update for tables with leading anymap columns, e.g.
q)a:get`:a 1:((1 2;3 4);(5 6;7 8)); (0#0;0#0)~a 0N / was: ()~a 0N q)update c:8,d:9 from ([]a) where i=1 / was 'length -
multithreaded fixed width load returned incorrect data for type S fields after skipped fields, e.g.
q)all 5=count each string last ("I *S";2 3 2 5) 0: ` sv 10000#enlist"12~~~hiMYSYM" / q -s 2
2024.04.29¶
NUC (Not Upwardly Compatible)¶
Not backward compatible. Changes existing behavior.
-
error if dictionary update contains by clause (previously ignored)
q)update a by b from([a:1;b:2]) / 'type
Fixes and improvements¶
-
on-demand now accepts, and ignores, the path component of the http_proxy environment variable, e.g.
$ http_proxy=http://127.0.0.1:8888/foo q -
abnormal exits, e.g. -w abort, would be attempted from several threads at once, causing repeated output and potential crashes
-
since 4.1t 2023.03.01, .Q.bv was broken for databases with par.txt containing relative paths
-
workaround a bug in rhel 7., (https://stackoverflow.com/questions/75305383/openat-recognized-dev-stdout-as-a-directory) manifesting as incorrect return for key called on /proc/PID/fd/, since 4.1t 2022.01.14
2024.04.08¶
Fixes and improvements¶
-
ctrl-d could cause seg-fault when in suspended mode, or explictly reading handle 0. e.g.
q)read0 each 0 0
2024.03.28¶
Fixes and improvements¶
-
parsing lambdas with exclusively constant pattern parameters could seg-fault since 4.1t 2024.02.02, e.g.
q){[1;2]} -
within lambdas, patterns with dictionary-valued filter functions could seg-fault since 4.1t 2024.02.02. now throws 'type, e.g.
q){d:([1;2;3]);(a:d):x} / 'type -
monadic enlist pattern could seg-fault since 4.1t 2024.02.02, e.g.
q)((,:)a):enlist 1; a~1 -
.z.ac default 401 response could cause a seg-fault since 4.1t 2023.12.14. i.e.
q).z.ac:{(0;"")}
2024.03.12¶
New¶
-
Now recognizes sec-websocket-protocol http header with value kxnodeflate to disable websocket compression. e.g.
javascript in browser:h=WebSocket("ws://host:port","kxnodeflate") -
extended -36! (load Data-At-Rest-Encryption key) to:
1)Expose whether a key has already been loaded, via -36!(::), returning 0b or 1b accordingly. 2)Lock -36! to avoid loading of another key, via -36!(`:keyfile;"password";bool), where bool indicates unlock/lock. To reload using a new key, unlock using current key and then proceed with the new key If load is attempted whilst locked, it throws 'DARE key locked. Added .Q.trpd, extending dot trap (.[f;X;g]) with backtrace, as per .Q.trp q).Q.trpd[{x+y};(1;2);{2"error: ",x,"\nbacktrace:\n",.Q.sbt y;-1}] 3 q).Q.trpd[{x+y};(1;`2);{2"error: ",x,"\nbacktrace:\n",.Q.sbt y;-1}] error: type backtrace: [2] {x+y} ^ [1] (.Q.trpd) [0] .Q.trpd[{x+y};(1;`2);{2"error: ",x,"\nbacktrace:\n",.Q.sbt y;-1}] ^ -1
Fixes and improvements¶
-
.z.w closing within .z.ws, or during a blocking read using h[], could seg-fault, since 4.1t 2023.09.15, e.g.
q)h({neg[.z.w]"hclose .z.w"};::) -
parse error within a lambda with pattern parameters could cause a seg-fault since 4.1t 2024.02.02, e.g.
q){[a:`i;b:`j]$1} q){[a:`i;$1] 1} -
a filter function pattern with mutating LHS and pure RHS could seg-fault since 4.1t 2024.02.02, e.g.
q)((:1+):{x}):1 -
top-level match of () could seg-fault since 4.1t 2024.02.02, e.g.
q)():1 / 'match -
assignment to reserved words threw 'match or 'nyi since 4.1t 2024.02.02. now throws 'assign
q)exit:1 / 'assign lambda compilation now detects unsupported match expressions ahead of execution q)f:{[x+y]x} / 'nyi -
in a partitioned select, projections used with aggregates could signal 'type, e.g.
q)select %[;2]sum a from t -
in a compressed hdb after .Q.MAP[], internal file descriptors were leaked to children, visible with e.g.
system"ls -l /proc/self/fd" .z.W from process with no handles, returns correct types (I!J) in empty dict q)0N!.z.W (`int$())!`long$() 2024.02.13 ** FIRST PRODUCTION RELEASE OF V4.1 **
2024.02.07¶
New¶
-
In TLS server mode, added two more options for the SSL_VERIFY_CLIENT environment variable, controlling connections from clients using certifcates.
SSL_VERIFY_CLIENT=YES unchanged, server requires the connecting client to provide a valid certificate SSL_VERIFY_CLIENT=NO unchanged, no client verification whatsoever, server does not request a certificate SSL_VERIFY_CLIENT=REQUESTONLY server requests a client certificate but allows the connection if the client certificate is missing or invalid SSL_VERIFY_CLIENT=IFPRESENT server requests a client certificate and terminates the connection if an invalid certificate is provided, continues if it is missing or valid with the YES, REQUESTONLY, and IFPRESENT options, information about whether the current handle's TLS certificate was successfully verified are now in .z.e`CERT e.g. q)h:hopen`:tcps://localhost:5001 q)h".z.e`CERT" SUBJECT | "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=myname.com" ISSUER | "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com" SERIALNUMBER | ,"1" NOTVALIDBEFORE| "Aug 9 15:27:19 2022 GMT" NOTVALIDAFTER | "Jun 17 15:27:19 2032 GMT" VERIFIED | 1b VERIFYERROR | 0
Fixes and improvements¶
-
pattern match with filter function (a:f):x restricted to functional types of f (lambda/projection/composition), e.g.
q)"type"~@[{(a:`a`B):x};1;::]
2024.02.02¶
NUC (Not Upwardly Compatible)¶
Not backward compatible. Changes existing behavior.
- ([]a::e) now throws parse (previously was amend of global 'a' with implicit column name)
New¶
-
dictionary literal syntax extends table/keytable literals. same rules w.r.t implicit key names apply:
q)d:([k1:v1;k2:v2;..]); k1:1;d:([k1;k2:2]); d:([1;2]);d~([x:1;x1:2]) similar to list literal syntax (;..), omission of values results in projection q)([k1:;k2:])[1;"a"] / ~ ([k1:1;k2:"a"]); compare: (;)[1;"a"] ~ (1;"a") pattern match: the left hand side of : can now be a pattern (a;b):(1;"ab") / also: (a;b)::.. assign global; (a[0];b[1]):.. amend; (;b):.. empty pattern matches anything (1;b;c):(2;"ac";`x) / throws 'match. on failure, the entire match fails and no assignments are made longstr:{$[10h=type x;"J"$x;'`type]} / a filter function can be used to check and transform values before assignment/return (a:longstr):"123" / assigns a:longstr["123"]. rhs of (a:e) is any expression that evaluates (before match) to filter function (:longstr):"123" / lhs pattern can be omitted if only the return value/check is of interest x:("12";5);x:(:longstr;:1+):x / x~12 6; equivalent to x:@[@[x;0;longstr];1;1+]; pattern return value used for complex amend (a:`j;b:`C):(1;"ab") / syntactic sugar to check type (type character like meta). a:`j equivalent to a:{$[-7h=type x;x;'`type]} function parameter declaration can specify patterns: q)f:{[p:`f;s:`j]p*s}; msg:{(sym:`s;ex:`c;price:`f):x} q)addprice:{[(s;e;p):msg;x:`f](s;e;p+x)}; q)addprice[(`A;"b";10.5);2.5] / w/o checks can do: addprice:{(;;:y+):x} -
patterns are matched by inverting functions. (;;..) enlist flip[d] k!v are invertible. other primitives nyi
(k!v):([a:1;b:`s]) / also: (k!): (![;v]): flip[k!v]:([]1 2;"ab") ([a;b]):([a:1;b:`s]) / implicit names: equivalent to ([a:a;b:b]):([a:1;b:`c]). NB. filter function requires explicit key names ([a;b]):([b:`s;a:1;c:"y"]) / for constant key dict patterns, a subset of keys is matched addp:{([p:p:y+]):x} / equivalent to {@[x;`p;y+]}; addp[([s:10;p:2.5]);3]~([s:10;p:5.5]) ([k1;k2]c1:a;c3:b):([k1:1 2;k2:"ab"];c1:"xy";c2:01b;c3:3 4) / (a;b)~("xy";3 4); likewise for table literals match special form tries multiple patterns f:{:[x;(`incP;p:`f);[P+:p;"incr P"]; / match on x. tries p1:x; .. p2:x; .. NB. might need a space before ':[..' (`setA;a:`j);[A::a;"set A"]; / syntax similar to cond($) "unknown command"]} / fails with 'match when no default specified
Fixes and improvements¶
- since 4.1t 2024.01.25, lambda execution in peach could throw 'varname or seg-fault.
2024.01.31¶
Fixes and improvements¶
-
Since 4.1t 2023.01.20, in rare circumstances, applying
p# org# attribute to mapped enum could seg-fault:q)a:get`:a set `sym?5120#`a; b:get`:a;c:get`:a;b:(); `p#c
2024.01.25¶
NUC (Not Upwardly Compatible)¶
Not backward compatible. Changes existing behavior.
-
(actually a fix for a bug since 2.6) value"..." inside select/exec on the main thread previously used lambda's scope for locals, now always uses the global scope, e.g.
q)a:0;{a:1;exec value"2*a"from([]``)}[] 0
Fixes and improvements¶
-
view calculation could use lambda scope instead of global scope, since forever.
-
Since 4.1t 2024.01.04, select could fail to look up enclosing lambda's local variables or parameters under peach, e.g.
q){select from t where {1b}[x]}peach 1 2 'x -
Since 4.1t 2024.01.04, \w memory accounting could be incorrect when using peach.
2024.01.23¶
Fixes and improvements¶
-
qcon protocol interface was not sending a response since 4.1t 2024.01.22.
-
Removed implicit activation of persistent http sockets from .h.hnz, as this could be called by a user out of the http handle's context. For the time being, .h.ka[timeout] must be set explicitly in the http handler's code.
-
Since 4.1t 2022.04.15, var/svar/dev/sdev could seg fault on general list comprising different types
q)var(1;2i) q)var(1 2;3 4i)
2024.01.22¶
Fixes and improvements¶
-
Block erroneous socket usage from multiple threads.
N.B. Multithreaded input queue mode and peach allow one-shot sync and http(s) client request only; these threads cannot hopen, hclose, nor use sockets from other threads - throws 'nosocket for these cases. -
http POST requests > 1500 bytes erroneously returned a raw char response "... is not an http handle", and did not close the connection,since 4.1t 2023.12.14.
-
Since 4.1t 2024.01.11, csv load on peach could seg fault
q)n:10000;{("js";1#",")0:x}peach 2#`:test.csv 0:","0:([]a:n#1;b:n?`2) Since 4.1t 2024.01.17, ipc could seg fault on windows
2024.01.17¶
Fixes and improvements¶
-
hclose of a system internal fd (usually 3 or 4) could cause cpu spin/lockup, since 4.1t 2023.09.15; now throws 'domain.
-
c-api socket callback mechanism (sd1 fn etc) was broken since 4.1t 2023.09.15.
2024.01.11¶
NUC (Not Upwardly Compatible)¶
Not backward compatible. Changes existing behavior.
- Loading shared libraries via 2: was resolving to a canonical path prior to load via the OS, since v3.6 2018.08.24; this caused issues for libs whose run-time path was relative to a sym-link. Now it resolves to an absolute path only, without resolving sym-links.
New¶
-
parallelize .Q.MAP over tables and partitions with peach
-
improvement to '?' (find) for unsorted real/float vectors when searching for null e.g.
q)a:100000#0f q)\t {a[x]:0Nf;?[a;0Nf]} each reverse til count a 1041 / was: 1587 q)a:100000#0e; q)\t {a["i"$x]:x;?[a;x]} each reverse "e"$til count a 520 / was: 816
Fixes and improvements¶
-
ipc msgs queued for sending were sometimes stalling until further handle activity, since 4.1t 2023.09.15.
-
file read of sym, where sym has length greater than 2097151, no longer result in parse error
q)get `:lsym set a:`$2097153#"a" -
fill (^) with keyed tables could give inconsistent results depending on the key order, since v 3.2, e.g.
q)([k:1 2 3]s:110b;t:1 2 3)^([k:1 2 3]t:3 4 5) k| s t -| --- 1| 1 3 2| 1 4 3| 0 5 q)([k:1 2 3]s:110b;t:1 2 3)^reverse ([k:1 2 3]t:3 4 5) k| s t -| --- 1| 0 3 2| 0 4 3| 0 5 -
vs on byte vector was erroneously inferring type from the rhs argument since 4.1t 2021.09.03, e.g.
q)0N!" "vs"x"$"a b"; (,"a";,"b") / previously (,0x61;,0x62) q)0N!0x20 vs"x"$"a b"; (,0x61;,0x62)
2024.01.10¶
Fixes and improvements¶
- csv parse 0: could return incorrect results or seg-fault parsing symbols under peach or in mtim
2024.01.08¶
Fixes and improvements¶
-
Since 2024.01.04, peach could seg-fault on rhs arguments other than mixed list, e.g.
q)(::)peach([]1 2;3 4)
2024.01.04¶
New¶
- peach now dynamically redistributes workload and allows nested invocation.
Fixes and improvements¶
- Since 2023.12.20, setting timer within .z.ts was causing immediate expiry.
2023.12.20¶
Fixes and improvements¶
- Since 2023.12.14, starting timer from cmd line or prompt failed to trigger .z.ts correctly.
2023.12.14¶
New¶
-
Added server side support for http persistent connections, enabled via .h.ka[idletimeout] during the processing of the http request.
.h.ka returns the value to use for the Connection header field value ["close"|"keep-alive"] in the response; using a different value to that returned may confuse the client app. Idletimeout has units of mS, and a value of 0 disables keepalive (i.e. .h.ka then returns "close"). -
Added support for TLS in multithreaded-input queue mode.
2023.11.10¶
New¶
- Enable TLS messaging on threads other than main
2023.10.30¶
New¶
-
.Q.gz (and HTTP) compression can now use less memory when resulting compressed data >8192 bytes or >10% of orig size (whichever is greater)
-
change to find,not equals,equals performance for int vector & types derived from int
Fixes and improvements¶
- since 2023.09.15, use of kx.lic could signal 'license error: sidecar init failure
2023.09.29¶
Fixes and improvements¶
- when writing anymap, empty vectors w/o attributes get deduplicated automatically (including enum vectors when enum name is 'sym')
2023.09.15¶
NUC (Not Upwardly Compatible)¶
Not backward compatible. Changes existing behavior.
- .z.W now returns handles!bytes as I!J, instead of the former handles!list of individual msg sizes. Use sum each .z.W if writing code targetting 4.0 and 4.1.
New¶
-
now supports >1022 ipc/websocket connections; it is limited only by system and protocol.
-
the c-api function sd1 no longer imposes a limit of 1023 on the value of the descriptor submitted.
2023.08.18¶
Fixes and improvements¶
-
Workaround a bug in rook-ceph (https://tracker.ceph.com/issues/61490), manifesting as “Invalid argument” error when issuing key cmd against a rook-ceph filesystem, since v4.1t 2022.03.25
-
csv export of symbol or character vector values containing newlines "\n" are now enclosed in double quotes e.g.
q)csv 0:([]("foo\nbar";"baz")) ,"x" "\"foo\nbar\"" "baz"
2023.08.04¶
New¶
-
lj/pj/aj/wj joins and variants can modify t1 in place
q)`t1 lj t2 q)`t1 ljf t2 q)`t1 pj t2 q)aj[`sym`time;`t1;t2] q)ajf[`sym`time;`t1;t2] q)aj0[`sym`time;`t1;t2] q)ajf0[`sym`time;`t1;t2] q)wj[w;`sym`time;`t1;(t2;(max;`bid);(min;`ask))] q)wj1[w;`sym`time;`t1;(t2;(max;`bid);(min;`ask))]
Fixes and improvements¶
-
in partitioned table queries, references to linked columns under group by no longer require remapping the foreign column for every group
q)select link.x by sym from trade
2023.06.30¶
Fixes and improvements¶
-
compression parameters could be lost when applying
p# org# attribute on-diskq)(`:a;12;1;0) set 1 2; p:-21!`:a;.[`:a;();`p#];(2_p)~2_-21!`:a
2023.05.26¶
New¶
- during process init, getpwuid can fall back on envvars HOME and USER
Fixes and improvements¶
```q
-21!x returned an incorrect dict for non-coded files residing on object storage; now returns empty dict.
```
2023.04.17¶
New¶
-
compression params can be provided when using '1:' to write compressed binary data e.g.
q)(`:file;17;2;9)1:100#0x0 -
.Q.view, also used when loading an hdb, now utilizes threads to load .d files (column names).
Fixes and improvements¶
-
using mtim (multithreaded input mode) with socket sharding could cause an instance to hang
-
on linux/mac, kdb+ could seg-fault if at least one TLS connection was present, and a new connection was assigned a socket descriptor above 1010.
2023.03.17¶
Fixes and improvements¶
-
reading scalar projections or compositions threw 'parse since initial release of v4.0. e.g
q)all{x~get`:parse.bin set x}each(1+;'[sum;avg])
2023.03.01¶
New¶
-
.Q.lo[`database;cd;scripts] to load a database without changing directory and/or loading scripts in the database, e.g.
q)\cd "/tmp" q)key`:db/2023.02.01 `s#,`trade q).Q.lo[`db;0;0] q)trade date sym time price ------------------------------------ 2023.02.01 C 10:15:18.957 6.346716 2023.02.01 B 10:15:18.958 9.672398 2023.02.01 C 10:15:18.959 2.306385 2023.02.01 B 10:15:18.960 9.49975 2023.02.01 A 10:15:18.961 4.39081 q)\cd "/tmp"
Fixes and improvements¶
-
concurrent anymap writes could result in broken files since kdb+4.1 2021.06.04, e.g.
q)v:(3?4000)#'"a";n:`$":a",/:string til system"s";{x set 100000?v}peach n;all{all (distinct get x)in v} peach n
2023.01.20¶
NUC (Not Upwardly Compatible)¶
Not backward compatible. Changes existing behavior.
- osx/windows performance improvement when using floating point calculations with denormal numbers on threads created via multi-threaded input mode or slave threads (rounds to zero)
New¶
-
applying `p# attribute is now faster and uses less memory, e.g.
q)a:where 10000#1000 q)\ts:10 `p#a 151 134873984 / was: 284 150995376 -
on-disk amend to apply
p# org# attributes now avoids in-memory copying, e.g.q)`:tab/ set ([]where 10000#100); q)\ts @[`:tab/;`x;`p#] 17 8522400 / was: 30 20973600
Fixes and improvements¶
-
windows will now pick up versions of openssl prior to v3
-
aggregation of non-vector types by type short with negative values failed with 'length
q)select sum x by y from ([](1 2;3 4);y:-1 1h)
2022.11.01¶
NUC (Not Upwardly Compatible)¶
Not backward compatible. Changes existing behavior.
-
.z.o for mac universal binary on arm returns
m64, previouslym64arm -
.Q.id now follows the same rule when provided name begins with an underscore as it does when it begins
-
with a numerical character. Previously could produce an invalid column name.
q).Q.id`$"_" `a_ q)cols .Q.id(`$("3aa";"_aa";"_aa"))xcol([]1 2;3 4;5 6) `a3aa`a_aa`a_aa1
New¶
-
-p cmd line option (or \p system command) can now listen on a port within a specified range e.g.
q)\p 80/85 q)\p 81 -
range of ports is inclusive & tried in a random order. A service name can be used instead of a port number. The existing
-
option of using 0W to choose a free ephemeral port can be more efficient (where suitable).
-
range can be used in place of port number, when setting using existing rules e.g. for hostname
q)\p myhost:2000/2010 or for multithreaded port q)\p -2000/2010 x) will try to load x.k_ if loading x.k fails function .Q.ld exposes logic used by \l to group script lines for evaluation q).Q.ld read0`:funcs.q 1 2 5 6 "/ multi line func" "f:{\n x+y\n }" "/ single line func" "g:{x*y}"
Fixes and improvements¶
-
extended no_proxy support for ondemand reporting to custom endpoints
-
debugger could return incorrect line numbers for multi-line functions containing multi-line comments
-
reading with 1: no longer strips quotes, e.g. ("abcd";"\"ef\"")~("**";4 4)1:"abcd\"ef\""
2022.09.02¶
NUC (Not Upwardly Compatible)¶
Not backward compatible. Changes existing behavior.
- .z.o for l64arm build is now
l64arm, previouslyl64.
Fixes and improvements¶
-
the on-demand system now honours the NO_PROXY/no_proxy environment variables, with the lowercase version taking precedence
-
Zstandard(zstd) algo for file compression was not recognizing negative compression level values correctly.
2022.08.19¶
Fixes and improvements¶
- removed redundant system call to unlink() file## when appending to nested/anymap file
2022.07.01¶
NUC (Not Upwardly Compatible)¶
Not backward compatible. Changes existing behavior.
-
experimental: added optional param (type long) to .Q.gc indicating how aggressively it should try to return memory to the os
q).Q.gc 0 / least aggressive q).Q.gc[] / most aggressive (continue to use this in the general case; currently matches level 2)
New¶
-
added support for Zstandard(zstd) algo for file compression, as compression algo 5.
Compression levels -7 (fastest) .. 22 (slowest, but best compression ratio). e.g. q).z.zd:17 5 1;x~get `:ziptest set x:asc 10000000?1000 -
append detected hostname onto license "host" error message, e.g.
'license error: host my-machine-hostname
2022.05.11¶
Fixes and improvements¶
-
multicolumn search could return wrong results for v3.5 enums and small rhs, since kdb+4.0 2020.07.15
q)`:oldenum set `:sym?`a`b`c / in v3.5 or earlier q)1 0 3 1~([]1 2 3;get`:oldenum)?([]2 1 0 2;`:sym?`b`a`c`b)
2022.04.15¶
New¶
-
d9 no longer modifies the reference count of its argument
-
var/dev/svar/sdev will traverse columns of tables and general/anymap/nested lists in a similar way to sum/prd/min/max (previously gave 'rank)
q)M:get`:m77 set m:(2 3;4 0N;1 7) q)T:get`:tab/ set t:flip`a`b!flip m q)var each(m;M;t;T) 1.555556 4 1.555556 4 `a`b!1.555556 4 `a`b!1.555556 4 q)dev each(m;M;t;T) 1.247219 2 1.247219 2 `a`b!1.247219 2 `a`b!1.247219 2 q)svar each(m;M;t;T) 2.333333 8 2.333333 8 `a`b!2.333333 8 `a`b!2.333333 8 q)sdev each(m;M;t;T) 1.527525 2.828427 1.527525 2.828427 `a`b!1.527525 2.828427 `a`b!1.527525 2.828427
Fixes and improvements¶
-
Calling parse or -4! with input over 2gb (0Wi) could cause crash. now returns domain error. e.g.
q)parse "a:3",0wi#"0" -
JSON serialization of negative minute/second/time/timespan types incorrect since 3.6 (2017.10.13) e.g.
.j.j([]startTime:-08:00 -06:30;endTime:16:00 -04:00) -
a link column with domain of a partitioned table requires the encompassing table to be partitioned too. could crash
-
when given a keyed table, now returns par error e.g.
q).Q.dd[`:/tmp/db1;`2022.01.01`ecfmapping`] set .Q.en[`:/tmp/db1] ([]firmName:enlist "DUMMY") q)\l /tmp/db1 q)select ecfmap.firmName from ([id:1 2];ecfmap:`ecfmapping!1 1) cmd line option -s now works with kx.lic
2022.03.25¶
NUC (Not Upwardly Compatible)¶
Not backward compatible. Changes existing behavior.
-
deprecated functions .Q.Xf and .Q.Cf removed (using resulting files could return file format errors since 3.6)
-
.Q.id for atom now produces `a when contains single character that is not in .Q.an (instead of empty sym) e.g
q).Q.id`$"+" `a (previous version returned `) -
.Q.id for atom changes are reflected in .Q.id for tables (as before, it was applied to each column name).
-
.Q.id for tables also has additional logic to cater for duplicate col names (names now appended with 1,2,etc when matched against
-
previous cols) after applying previously defined rules e.g.
q)cols .Q.id(`$("count+";"count*";"count1"))xcol([]1 2;3 4;5 6) `count1`count11`count12 (previous version returned `count1`count1`count1) q)cols .Q.id(`$("aa";"=";"+"))xcol([]1 2;3 4;5 6) `aa`a`a1 (previous version returned `aa`1`1)
New¶
-
support for openssl v3
-
on linux, q will now try to load versioned shared libraries for openssl if libssl-dev[el] is not installed.
-
new licensing option: kx.lic
-
fatal errors now include kdb+ version details to aid investigation into issues
-
.Q.prf0 won't try to stop the process if passed negative pid. useful for calls in the middle of debugging etc.
-
dot index can now operate on persisted tables e.g.
q).[`:/tmp/db/t/;(0 1;`v)]
Fixes and improvements¶
-
"x"$ on longs over 0Wi is now consistent with lower values, e.g. 0xfeff00~"x"$-1 0 1+0Wi
-
key`:filesymlink on windows now signals error when no access permissions to reach target file
-
key`:path/file on linux/mac now returns () when path contains a regular (non-dir) file
-
Corruption of .Q.pt could occur when providing .Q.view with a value that resulted
-
in no matches with .Q.PV (partition values). Now returns error "invalid partition filter".
-
reinstated s-fail,bad lambda error when file reading, was prev changed to parse error since 4.0 (2019.12.12) and 4.1t
2022.01.14¶
Fixes and improvements¶
-
retain compression settings when appending to a compressed file and the file was recreated. e.g.
q).z.zd:17 2 6;`:file set();system"x .z.zd";`:file upsert 1000#0;-21!`:file -
appending a vector to an empty file was leaking file descriptors. e.g.
q)(`:empty set())upsert 0 1
2021.12.07¶
New¶
-
projection creation from a lambda/foreign will result in a rank error if too many parameters defined, e.g.
q){x}[;1] 'rank
Fixes and improvements¶
-
select with a symbol literal under simple aggregate could seg-fault, e.g.
q)select sum a*(`aaf=`aaf)|(`aaf=`aaf)|(`aaf=`aaf) by b from ([]a:1 2;b:3 4) -
removed a race condition on generating system error messages on non-windows platforms.
-
block using unregistered ipc handles with k(h,... from the C api, using an unregistered ipc handle resulted in inconsistent serialization modes.
-
type failure on a sync send would close the underlying socket, e.g.
q)h:hopen`:localhost:5000 q)@[h;`:./a 2:`a,1;::] / attempting to send a dynamically loaded function "type" q)h"1+2" 'Cannot write to handle 3. OS reports: Bad file descriptor
2021.11.04¶
Fixes and improvements¶
-
reads were excessively large for compressed|encrypted files from block storage, since initial 4.1
-
q could crash on startup whilst reading a malformed k4.lic, e.g. with kc.lic renamed to k4.lic
2021.10.13¶
New¶
-
non-TLS connections to TLS server (or vice vera) error messages now include the IP address, e.g.
'TLS only (127.0.0.1)
Fixes and improvements¶
-
improved limit check for where long vector, was seg-faulting when input overflowed, e.g.
q)where 0W 0W 1 1 -
misleading 'OS reports: File exists' when malformed .z.zd is used to write compressed files, now reports 'file compression..., e.g.
q).z.zd:();`:/tmp/aaa set til 10 'file compression - expecting (blockSize;algo;zipLevel) or filenames!((blockSize;algo;zipLevel);...) -
using -25! with a null handle will print '0N' as the handle in the error message, previously would print '-9223372036854775808', e.g.
q)-25!(1#0N;"aaa") '0N is not an ipc handle -
hdel now signals 'access when used in reval or -b (blocked) mode, e.g.
q)hopen[4000]"reval(hdel;enlist`:somefile)" 'access: somefile -
hopen on a file now applies access rules when used in reval, -b (blocked) mode, or with -u 1/file, e.g.
q)h:hopen 4000 / to a server started with -u 1 -p 4000 q)h"reval(hopen;enlist`:somefile)" 'access: somefile q)h"hopen`:../somefile" 'access: ../somefile -
hopen on a fifo now applies access rules when used with -u 1/file, e.g.
q)hopen[4000]"hopen`:fifo://../somefifo" / to a server started with -u 1 -p 4000 'access: ../somefifo -
multithreaded load (csv, 0: and 1:) was slow for small vectors since 2021.09.28, e.g.
q)\t ("ii";4 4)1:/:0N 8#1000000?0x0 -
.Q.gz was not processing compressed data larger than 4GB. e.g.
q)r~.Q.gz .Q.gz(6;r:4294967295?0x00) -
"H"$" " was parsing as 0h rather than 0Nh, since 4.1 2021.09.03, e.g.
q)0Nh~"H"$" "
2021.09.28¶
New¶
-
csv load(excluding embedded line return mode), fixed width load (0:) and binary load (1:) are now multithreaded, e.g.
q)v:` sv 10000000#","0:10 10#til 100 q)\t system"s 10";(10#"J";",")0:v
Fixes and improvements¶
-
http server 'authorization' header had garbled credentials for non-basic auth.
-
creating loadable functions via 2: or dl in the c-api would leak memory since 4.0 2020.03.09
-
on linux, processes started by \q would not be cleaned up on exit, shown as state Z or
in ps output, again since 4.1t 2021.03.30 / 4.0 2021.04.06 -
partitions ending in $ were not ignored when using segments(par.txt).
2021.09.03¶
New¶
-
vs/sv extended to byte vectors, e.g.
q)0x0203 sv 0x0203 vs "x"$til 6 0x0001020304 q)0x02 vs "x"$til 5 0x0001 0x0304 0b sv/vs extended to guids, previously gave 'type, e.g. q){x~0b sv 0b vs x}rand 0Ng -
parsing values outside of the short domain was clamping them to ±0Wh instead of to 0Nh. e.g.
q)0Nh~"H"$"32768"
Fixes and improvements¶
-
in multithreaded input mode, the main thread cpu could increase when a client connected, .z.ts could be invoked with the wrong timestamp or at an incorrect interval, since 4.1t 2021.03.30.
-
.Q.gz was throwing type when compressing byte vectors. e.g.
q){x~"c"$.Q.gz .Q.gz(6;"x"$x)}10000#"helloworld" -
all peach and mtim threads are now properly interrupted by ^C/SIGINT/timer.
-
loading a splayed table with a column named ` could seg-fault, now loading and saving is blocked signalling 'domain.
-
.Q.dpft .Q.dpfts now require the `p# column (f argument) to be present in the table.
0 wavg x is now 0n, consistent with other cases, e.g. q)0 wavg 0 1 0n / previously 0.5 -
display for 0Wh was not consistent with 0Wi, as it printed the underlying value 32767h. e.g.
q)"0Wh"~-3!0Wh -
select with a simple aggregate on table-valued column and where clause was throwing 'type, e.g.
q)select last x by n:i from ([]([]a:enlist"AB")) where i=0
2021.07.12¶
NUC (Not Upwardly Compatible)¶
Not backward compatible. Changes existing behavior.
- block exit[i] during reval or -u cmd line, when handle is a remote. \ was already blocked.
New¶
-
if neither LINES nor COLUMNS environment variables are set, \c will be set to the terminal dimensions. \c 0N 0N resets using that logic.
-
extended the range of .z.ac to (4;"") to indicate fallback to try authentication via .z.pw.
Fixes and improvements¶
-
variables in namespaces ".m*" could be incorrectly assigned to memory domain 1, e.g.
q)-120!'.mm.a:1 1
2021.06.12¶
Fixes and improvements¶
-
writing anymap-backed lambdas or symbol vectors w/attributes to anymap could seg-fault:
q)`:x set get `:x set (`s;{([]s:1)};`a`b;`g#`c`a`b;`a`b)
2021.06.04¶
New¶
-
anymap write now detects consecutive deduplicated (address matching) toplevel objects, skipping them to save space
q)a:("hi";"there";"world");`:a0 set a;`:a1 set a@where 1000 2000 3000;(hcount`$":a0#")=hcount`$":a1#" -
improved memory efficiency of writing nested data sourced from a type 77 file, commonly encountered during compression of files. e.g.
q)`:a set 500000 100#"abc";system"ts `:b set get`:a" / was 76584400 bytes, now 8390208. -
update from splayed table and path@tablename now leverage peach to load columns (improving performance of e.g. meta). e.g.
q)`:db/2000.01.01 `t q)update x:0 from get`:mysplay/
Fixes and improvements¶
-
key`:nfsmnt/ could signal ENOENT error, rather than ()
-
ipc compression is disabled for connections on all local interfaces, previously was only disabled for connections to 127.0.0.1 or 'localhost'
-
xbar was incorrect for float input, since v3.0. e.g.
q).1 .2 .3 .4 .5 .6~.1 xbar .1 .2 .3 .4 .5 .6 q)4.4~1.1 xbar 5
2021.05.07¶
New¶
-
m64 is now a universal binary, containing both intel and arm builds for macos.
N.B. Apple M1 has a page size of 16k, and this impacts the minimum logical block size supported for file compression/decompression. Dynamic loading of Openssl/crypto libs on macos now requires version 1.1. -
l64arm build available.
Fixes and improvements¶
-
writes to compressed files did not retry when data was only partially written by the OS, leaving the file unreadable, present since v2.8
-
select from([]1 2)where i=0i would signal 'type.
-
select from([]1 2)where i in 0 would signal 'type.
-
q could fail to connect to licensing servers on startup intermittently whilst running under an on-demand licence.
2021.04.16¶
New¶
-
added .z.r, a boolean, to indicate whether an update in this context would be blocked or not. e.g.
q)1b~.z.r / in reval, -b cmd line (read-only), or a thread other than the main event thread.
Fixes and improvements¶
-
"system" could fail on unix since 4.1t 2021.03.30
-
an error in thrown in the http handlers .z.pp/.z.pm caused a seg-fault since 4.1t 2021.03.30
-
remove 90 day time limit, 4.1t would exit if run more than 90 days from the release date.
-
.Q.dpt and .Q.dpts were removing the attr on enumerated columns. e.g.
q)t:([]`g#`a`b`c);.Q.dpt[`:db;2000.01.01;`t];`g~attr `:db/2000.01.01/t `x / changes since kdb+ 4.0
2021.03.30¶
NUC (Not Upwardly Compatible)¶
Not backward compatible. Changes existing behavior.
-
using handles within peach is temporarily not supported, to be reviewed in the near future e.g.
q)H:hopen each 4#4000;{x""}peach H 3 4 5 6i -
one-shot ipc requests can be used within peach instead.
New¶
-
multithreaded input mode now supports websockets and http (but not yet TLS), a custom .z.ph which does not update global state should be used with http.
-
added support for HTTP methods PATCH, PUT and DELETE, routed through .z.pm similar to OPTIONS method.
-
clock source for walltime (used by .z.p,.z.n) on linux now returns nanosecond precision.
-
select from partitioned tables maps relevant columns within each partition in parallel.
Fixes and improvements¶
-
http server now defaults Content-Length to 0, thus allowing empty request, previously threw 'length.
-
x vs y for ints was erroneous for y>2^53. e.g.
q)string[x]~raze string vs[10;x:"j"$2 xexp 55]