kdb+ 3.6 Release Notes¶
This page details the latest features and improvements released to kdb+ 3.6.
2026.01.27¶
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)
-
licence related errors are now reported with the prefix "license error: ". .e.g "'license error: upd".
-
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)"
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;::]
2024.04.10¶
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)
2024.02.06¶
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.
2023.11.21¶
New¶
-
removed the 255 byte limit from hsym, e.g.
q)hsym`$263?" " -
path length limit is now 4095 bytes, instead of 255
-
os errors are now truncated (indicated by '..') on the left to retain the more important tail, e.g.
q)get`$":root/",(250#"path/"),"file" '..path/path/<snip>/path/file. OS reports: No such file or directory
2023.04.17¶
NUC (Not Upwardly Compatible)¶
Not backward compatible. Changes existing behavior.
- added support for openssl 1.1.x
Fixes and improvements¶
- 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.13¶
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/2010or for multithreaded port
q)\p -2000/2010
2022.10.18¶
Fixes and improvements¶
- http server 'authorization' header had garbled credentials for non-basic auth.
2022.04.15¶
New¶
- d9 no longer modifies the reference count of its argument
2021.12.07¶
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)
2021.04.26¶
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
2021.03.04¶
Fixes and improvements¶
-
block until async message received, h[], was not processing incoming sync requests.
-
an error response to a sync ipc request would leave the handle in a blocking mode, potentially stalling kdb+ until another message was received on that same handle.
New¶
- on windows builds, tcp send and receive buffers are no longer set to fixed sizes allowing autotuning by the OS.
2020.11.27¶
Fixes and improvements¶
- mapped ragged splays would sometimes leak virtual memory, e.g. select from`:ragged/
2020.09.22¶
Fixes and improvements¶
-
fills on a vector with nulls longer than 2^31 could return incorrect result
-
enumerating a symbol vector with nulls longer than 2^31 could return incorrect result
-
ssl ipc and https could seg-fault under on demand
2020.08.10¶
Fixes and improvements¶
-
in rare circumstances, q could fail to return a portion of allocated memory to the OS
-
http client would throw 'close if the content-length header was missing from the response, since v3.6 2020.04.16.
-
= always returned false for enum atoms of different domains, e.g.
q)(`z?`a)=`s?`a
2020.05.04¶
Fixes and improvements¶
-
after an http client request, or under on demand licensing, \p 0 could close a handle other than the listening port,
and hclose h could erroneously throw 'domain, since 3.6 2020.04.16.
2020.04.16¶
Fixes and improvements¶
-
kdb+ would enter an infinite loop when reading a response to an http request if the remote disconnected during the read.
-
http client was case-sensitive to http header field names. For ease of processing, all field names are now automatically converted to lowercase on reception. e.g.
q)(`$":http://www.kx.com:80")"GET / HTTP/1.1\r\nHost: host:port\r\n\r\n"
2020.03.09¶
Fixes and improvements¶
-
upsert with both lhs and rhs as mapped nested, with `s#lhs, was seg-faulting. e.g.
q)`:v set`s#(0 1;1 2);v,:v:get`:v -
redirecting stdout and stderr via \1 and \2 was moving them away from the usual underlying descriptors of 1 and 2, since 3.6 2020.01.29.
These descriptors could then become available for sockets which would then route attempts to write via 1"" and 2"" to those tcp handles. -
\l was failing if the directory to load had a dot as the penultimate char in its name. e.g.
q){@[hsym`$x;`x`y;:;0 1];system"l ",x}"/tmp/tmp.a.b";(x;y)~0 1
2020.02.28¶
Fixes and improvements¶
- replication server was sending badly formed messages to the client for console messages logged via 0"cmd here", since v3.6 2020.02.24.
2020.02.24¶
Fixes and improvements¶
-
when logging using -[lL] cmd line option, logging messages > 2GB resulted in a seg-fault or corrupting the log file.
-
select was leaking memory when passed a constraint of a boolean vector of an incorrect length. e.g.
q)select from ([]())where 100000000#0b
2020.02.14¶
Fixes and improvements¶
-
upsert to a splayed table with out-of-order columns could have appended to the wrong column if no other error (type, rank) was detected. e.g.
q)([]s:4 5 9 10;a:0 1 5 6;b:2 3 7 8)~select from get(`:t/ set([]s:4 5;a:0 1;b:2 3))upsert([]a:5 6;b:7 8;s:9 10) -
set was erroneously testing for the presence of the cwd, and recreating it when missing, for a fully qualified windows path containing a disk designator. e.g.
q)`:C:/parentdir/subdir/file set 0
2020.01.29¶
New¶
-
if \1 and \2 are given the same file, they will now share the same file table entry. This mimics the redirection
of stdout and stderr at a unix shell "cmd > log.txt 2>&1". e.g. q)system each("1 log.txt";"2 log.txt")
Fixes and improvements¶
- timeout (via \T cmd) could have resulted in a different error to 'stop, e.g. 's-fail.
2019.11.13¶
New¶
- .z.ph now calls .h.val instead of value, to allow users to interpose their own evaluation code. .h.val defaults to value.
Fixes and improvements¶
- to reduce the number of system calls with glibc 2.25, sorting no longer makes calls to getpid() to seed the random number generator.
2019.11.04¶
Fixes and improvements¶
-
grading functions, compositions and projections was erroneous. e.g.
q)`s#({};{}) / sometimes threw s-fail -
a fix in v2.8 2012.02.14, to allow trap of snapshot queries, erroneously routed amend for such paths to a nop. e.g.
q)x~get `:a:b set x:0 1 / n.b. avoid colons in filenames due to hopen recognizing these as `:host:service -
ljf was not filling from lhs for null rhs for sorted key on rhs. e.g.
q)([]a:0 1;b:`x`z;c:0 0N)~([]a:0 1;b:`x`y;c:2 0N)ljf([a:`s#0 1]b:``z;c:0 0N) -
exposed K vk(K) to c-api, "vector from list of k objects", which tries to collapse a list of:
homogenous elements to a vector, or conforming dictionaries to a table. e.g. K f(){J i;K x=ktn(0,0);for(i=0;i<10;i++)jk(&x,g(i));return vk(x);} // g(i) could return different types -
exposed K vi(K x,UJ j) to c-api "vector[index]", which allows accessing elements of types 77..97 inclusive, akin to xK[i] for x of type 0.
The result should be freed via r0(result) when it is no longer needed. -
appending a table to anymap was rewriting it. e.g.
q)`:a set(`a`b!1 2;`b`c!3 4);`:a upsert(`c`d!5 6;`c`d!7 8) -
.z.ac generated an incorrect http response on error. e.g.
q).z.ac:{(3;"")}
2019.09.19¶
Fixes and improvements¶
-
closing a websocket would flush it, causing the process to block until all pending data for that socket had been sent.
q)neg[h][];hclose h; / if flushing is required prior to close, this must now be done explicitly, as shown. -
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. -
.Q.dpft no longer checks for unmappable columns (type 0 with heterogenous element types), as all data is now mappable.
2019.09.02¶
Fixes and improvements¶
-
on-disk guid vectors with a u,p or g attr written by v3.5, when rewritten unmodified by v3.6 would have incorrect attr data. e.g.
q)`:/tmp/guids set `g#101?0Ng / write down using v3.5 or prior version q)`:/tmp/guids36 set get`:/tmp/guids;til[count g]~g?/:g:get`:/tmp/guids36 / guid vector in 3.6 q)`:/tmp/guids36 set(1 2;get`:/tmp/guids);til[count g]~g?/:g:(get`:/tmp/guids36)[1] / guid vector embedded in anymap in 3.6
2019.08.20¶
Fixes and improvements¶
-
block saving locked functions and views to type 77 files. e.g.
q)`lockedf.q 0:enlist"f:{}";system each("_ lockedf.q";"l lockedf.q_");@[`:a set;1#f;"type"~] q)value"v::a+1";@[`:a set;1#`. `v;"type"~] -
functional select could erroneously engage aggregation optimisations if an application was represented as a symbol list. e.g.
q)f:count;t:([]1 0;2 3);(0 1!1 1)~?[t;();`x;(last;`f`x1)]
2019.08.13¶
Fixes and improvements¶
-
serving process would print "'snd. OS reports: Broken pipe" in the event a client disconnected prior to handshake completion.
-
amend of a table with mapped nested columns, which contain a generic null, could return an erroneous result. e.g.
q)([](`b;::))~@[select from`:f/ set([](`a;::));0;:;`b]
2019.07.25¶
Fixes and improvements¶
-
improved performance of delete when no rows match. e.g.
q)t:([]til 100000);system"ts:1000 delete from `t where 0b" N.B. in such a scenario any attributes on columns are retained. e.g. q)a:([]`s#til 100000);delete from `a where 0b;attr a`x
2019.07.04¶
Fixes and improvements¶
-
kdb+ could segfault when testing for local interface under certain network configurations.
-
improved performance of a?b when count[a]<count[b] and a and b have the same enum domain but are different types. e.g.
q)`:a set`:e?`$string til 10000000 / write enum and domain using 3.5 q)load`e`a;system"t a in `e!-1 -2+count e" / using 3.6 -
avoid re-enumeration for “select . .where x in y” when x is a 3.5 enum with attributes. e.g.
q)`:a set`p#`:e?`$string til 10000000 / write enum and domain using 3.5 q)load`e`a;system"t select a from ([]a) where a in `e!-1 -2+count e") / using 3.6
2019.06.20¶
Fixes and improvements¶
-
linux only: removed direct dependency on libnsl due to issues with RH8/Fedora28.
-
g attr in anymap (type 77) resulted in errors including segfault when read.
q)0x0100000014000000000001000000000400000000~-8!get`:f set enlist`g#()
2019.06.09¶
Fixes and improvements¶
-
delete erroneously collapsed lists of dicts within tables, since v3.6 2019.06.05. e.g.
q)0h~exec type x from delete from([]([]0 1 2))where 010b
2019.06.05¶
New¶
-
allow column names other than time for the optimization '... where time> < >= <=' with time of `s#temporal type. e.g.
q)t:([]t:`s#.z.p+til 100000000);system"t:100 select from t where t>.z.p" -
setting an attribute using attr# on an object in a v3.6 format file now avoids rewriting the file if it already has that attribute. e.g.
q)`:f set`s#0 1;@[`:.;`f;`s#] -
delete now processes tables column-by-column, with less memory overhead. e.g.
q)t:1000000#flip(`$"a",/:string til 20)!20#enlist til 2;system"ts delete from `t where a0>0"
Fixes and improvements¶
-
dev,var,cov,cor and hopen now roundtrip through ipc using wrapper lambdas in the .Q namespace. e.g.
q)all{x~-9!-8!x}each(hopen;dev;var;cov;cor) / roundtrip matches q)all{.Q.qa(0(::;x);0 1)}each(dev;var;cov;cor) / allows .Q.qa to detect aggregation functions ok q)(~).(0;value)@\:(eval;parse"select dev x from ([]0 0;`a`b)") / check execution of raw vs serialized query n.b. these lambdas in other namespaces continue to [de]serialize as lambdas in those namespaces. e.g. q)10b~last value each("\\d .a";".a.dev:{dev x}";"\\d .";"(.a.dev;{dev x})~\\:-9!-8!.a.dev") -
bin and ops which use it, such as find, were erroneously not finding elements in sorted anymap (type 77). e.g.
q)3 3~(f;get`:f set f:`s#10 1#til 10)bin\:enlist 3 -
tables with anymap columns (starting from second) erroneously appeared sorted. e.g.
q)`s#get`:a/ set([]2#1 1;("ba";"ab")) / should throw 's-fail -
encountering 'params, 'locals, 'globals, 'limit and 'branch errors for lambdas could leak memory. e.g.
q)do[5;@[value;"{[a;b;c;d;e;f;g;h;i]}";::];0N!.Q.w[]`used]
2019.05.24¶
Fixes and improvements¶
-
.j.j could segfault if given a dict where the value was atomic. e.g.
q)@[.j.j;(1#`)!`;"length"~] -
lookups mixing v3.5 and v3.6 enum formats with matching domains previously had re-enumeration overhead. e.g.
q)`:a35 set `:sym?`$string til 1000000 / write down using v3.5 q)`:a36 set get`:a35 / write down using v3.6 q)load`sym`a35`a36;system each"t:100 ",/:("s:`sym$last sym";"a35?s";"a36?s") -
reading enums in log format could leak memory. e.g.
q)h:hopen`:a set ();h enlist(`u;`sym?`a`b`c);hclose h;do[5;get`:a;0N!.Q.w[]`used] -
in-place sort on disk could leave a splay partially sorted if a column was a nested type (78..97). e.g.
q)`:t/ set([]1 0;2 2#0) / write down using v3.5 q)`x xasc `:t/ / v3.6 throws 'no amend to q3.5 file format: t/x1 -
lt/gt/within comparisons between a sorted float vector and an atom would ignore comparison tolerance since 3.6 2018.09.26. e.g.
q)000b~(`s#1+6 7 8*1e-16)<1+8*1e-16
2019.05.14¶
Fixes and improvements¶
-
block append to enum domain files which have sort attr. e.g.
q)(`:myenum set`s#`a`b)?`c / now throws 'no append to `s#enum domain: myenum -
(`s#chars)ss char would return an invalid object, since kdb+3.1. e.g.
q)1 2~(`s#"foo")ss"o" -
writing a splay where the path and column name exceeded the limit could result in a partially written splay. e.g.
q)(`$":",(250#"a"),"/")set([]a:();bb:();ccc:();dddd:();eeeee:()) -
windows only - if kdb+ was listening on the same port as the target process for hopen, and the target was not a local interface,
it was random whether the target would be erroneously identified as self. -
using a websocket without zlib installed was printing an error message "The specified module cannot be found" to stderr, since v3.6 2018.12.24
-
hclose on a websocket was segfaulting since 3.6 2018.10.23.
2019.04.30¶
New¶
-
support async send to client in multi-threaded input queue mode. N.B. in mtiq mode, async blocks until the message is sent in full. e.g.
q)h:hopen 5000;neg[h]"neg[.z.w]f[]" / client sends async and receives async response. -
.Q.trp no longer truncates errors to 254 chars. e.g.
q)1000~count (.Q.trp[{(`success;x[])};{'`$1000#"a"};{(`error;x;y)}])1 -
optimizations for =, in and within are now leveraged for select if the initial where constraints each evaluate to scalar 1b. e.g.
q)t:([]`g#1000000?`3;1;2;3);f:{1b};system"ts:1000 select from t where f[],f[],x=first x"
Fixes and improvements¶
-
'parse could have been thrown in 3 cases of bad data - ipc header, binary data from file, or k/q code.
Now refined such that a bad ipc header results in 'badmsg, and when reading bad binary data from file 'parse shows filename. e.g. q)@[get;`:somefilename 1:0xff01f5616263;"parse `:somefilename"~] -
websocket error message for 'close did not always include the handle.
-
debug caret position was wrong for throw. e.g.
q)fun:{2+2;'`err};{fun`}`
2019.04.02¶
Fixes and improvements¶
-
\w n where n>2147483647 or n<0 was behaving as \w 1, now throws 'domain. e.g.
q)\w 2147483648 -
csv generation was not escaping enumerated symbols which had an embedded comma. e.g.
q)(1#"x";"foo";"\"bar,baz\"")~csv 0:([]x:`e?`$("foo";"bar,baz")) -
serialization for ipc could erroneously throw 'type instead of 'limit.
-
.Q.hmb, used by .Q.hg and .Q.hp, was not processing http_proxy/no_proxy environment variables correctly.
-
.z.bm was passed the compressed message when a compressed but invalid message was deserialized.
-
error msgs related to snd/rcv on sockets now include the associated handle. e.g.
'snd handle: 6. OS reports: Broken pipe 'rcv handle: 5. OS reports: Connection reset by peer 'close handle: 6 -
fatal memory related errors (wsfull, -w abort, "too many syms") are now prefixed with the timestamp if no console present. e.g.
$echo "til 100000000" | q -w 64 # '2019.03.11T15:13:02.532 -w abort
2019.03.07¶
New¶
-
further to the KX_MIN_CLIENT_CAPABILITY feature released in 3.6 2018.10.23, if this value is negative,
it will only warn via stderr, not reject the connection. e.g. $KX_MIN_CLIENT_CAPABILITY=-1 q
Fixes and improvements¶
-
vs would seg fault if rhs was an atomic enum and the domain of the enum was not available. e.g.
q)@[` vs;`missingenumname!0;"type"~] -
csv generation was not escaping symbols which had an embedded comma. e.g.
q)x~("JS";enlist",")0: csv 0:x:([]id:1 2;text:`$("Hi";"Hello, World!")) -
.Q.ts, added in 3.6 2018.05.04, was not returning the actual result. Now it returns (time space;result). e.g.
q).Q.ts[.Q.hg;enlist`:http://www.google.com] -
deserializer was not validating that booleans were either 0 or 1. e.g.
q)@[-9!;@[-8!2#1b;14;:;0x2];"badmsg"~]&@[-9!;@[-8!1b;09;:;0x2];"badmsg"~] -
group was throwing 'rank for a table of a single column of conforming dicts (a table column). e.g.
q)(([]a:(`a`b!1 2;`a`b!3 4))!(1#0;1#1))~group([]a:(`a`b!1 2;`a`b!3 4))
2019.02.19¶
Fixes and improvements¶
-
regarding reading anymap files:
- containing sym values that are all null could segfault. e.g. q)get`:a set (1 2;200 200#`) - in the absence of file## sym values are filled with null, previously a missing/deleted file## would lead to a segfault. -
appending to a compressed file could segfault, since v3.6 2018.06.14. e.g.
q).z.zd:17 3 6;`:f set 0#0x0 q)`:f upsert 1#0x0 / segfault in a new kdb+ instance -
xasc/xdesc now check, via .Q.ord, for duplicate column names on input table, as otherwise the result is undefined. e.g.
q)@[xasc[`a`b];flip`a`b`a!();"dup a"~] -
0: was throwing type if given a delimiter of "\000". e.g.
q(`a`A;`b`B)~("SS";"\000")0:("a\000b";"A\000B") -
string was not treating \000 the same as other chars. e.g.
q){string[x]~enlist each x}"a\000b"
2019.01.31¶
New¶
-
remote connections using the "qcon" text protocol are now routed to .z.pq, which defaults to calling .z.pi.
This allows a user to handle remote qcon connections (via .z.pq) without defining special handling for console processing (via .z.pi). see https://code.kx.com/q/cookbook/firewalling for locking down message handlers.
Fixes and improvements¶
-
under some circumstances, \d was throwing random error text for an invalid namespace.
-
fixed debug caret placement for undefined name U for:
select from ([]time:`s#.z.p+til 10) where time>U select from ([]1 2) where x in U select sum U by x from ([]1 2) exec sum U by x from ([]1 2) select i by sym from ([]sym:`p#`a`b) where sym in U
2018.12.24¶
Fixes and improvements¶
-
websockets were not using "Sec-WebSocket-Extensions: permessage-deflate" unless a file had been [de]compressed using zlib, since 3.6 2018.06.14.
-
-w 0 set on cmdline would erroneously set limit to 64MB, since 3.6 2018.11.25.
-
wj now support multi-col args, taking resulting column name from last arg. e.g.
q)wj[w;f;t;(q;(wavg;`asize;`ask);(wavg;`bsize;`bid))]
2018.12.06¶
NUC (Not Upwardly Compatible)¶
Not backward compatible. Changes existing behavior.
- the internal function -31!, which underpins .j.j has changed signature. .j.j remains unchanged in functionality.
New¶
-
added .j.jd, allowing the json serializer to take a dictionary of options to specify whether [-]0w should map to "[-]inf" or "null".
n.b. DO NOT call -31! directly; use .j.j or .j.jd. e.g. q)"[null,0,1,2,3,null]"~.j.jd(-0w 0 1 2 3 0w;(!). 1#'`null0w,1b) q)"[-inf,0,1,2,3,inf]"~.j.j -0w 0 1 2 3 0w / .j.j unchanged -
conditional operator both inside and outside a lambda returns generic null for even number of arguments.
Previously threw 'cond since 3.6 2017.09.26. e.g. q){(::)~$[0;1;0;2]}[] q)(::)~$[0;1;0;2]
Fixes and improvements¶
-
table amend with columns not matching could leave the table inconsistent. Now throws mismatch. e.g.
q)t:t0:([]1 2;3 4);(t~t0)&"mismatch"~@[{t[0]:`x`a!5 6};`;::] -
.z.vs could erronesouly set `s# on second argument when called from update with where clause. e.g.
q)t:([]0 1);.z.vs:{0N!(x;y)};update x from `t where i=0 / .z.s prints (`t;`s#,`s#(=;`i;0)) -
.z.vs and views now trigger for fully qualified names in default namespace. e.g.
q)xview::x+1 q)x:1;xview+1;`..x set 8;xview~9 -
improved the release order of blocks during .Q.gc.
-
block interning of symbols >2GB with 'domain. e.g.
q)@[`$;(0Wi+1)#"q";"domain"~]
2018.11.25¶
New¶
-
improve performance of equal for guids. e.g.
q)g1:rand g:-100000?0Ng;system"ts:1000 g=g1"
Fixes and improvements¶
-
indexing enum vectors could segfault. e.g.
q)a:`sym!til(-16+128*1024*1024)div 8;a til count a -
allow .Q.w to be called in non-main thread. returns null for symbol stats for slave threads.
-
set wmax to actual allocation on startup for low -w
2018.11.09¶
Fixes and improvements¶
-
when invoking handle[], a partially received message on that handle would have been read in full and then routed through .z.pg/.z.ps,
and then block until the next message. It should have read that partial message in full and returned it as a result to the h[] call. -
if stderr was closed, kdb+ could lock up when trying to print to stderr from the debugger.
-
indexing a splay at depth was leaking memory. e.g.
q)`:t/ set([]0 1);get[`:t/][0 1;`x];.Q.w[]`mmap -
upsert could corrupt 3.5 nested files when appending 3.5 mapped data. e.g.
q)`:f upsert get`:f / with f containing nested data written by v3.5 or prior version -
improved error message when incompatible append to file format attempted, was 'type. e.g.
q)`:/tmp/v35 upsert x / throws 'no append to q3.5 file format: /tmp/v35 -
upsert resets `s# for no longer sorted nested lists. e.g.
q)`~-2!get(`:a set `s#(1 2;3 4))upsert`s#(3 2;5 6) -
read0/read1 could cause wsfull when passed obviously out of range values. e.g.
q)read0(hopen`$":fifo:///dev/random";0Wj) / now throws 'domain
2018.10.23¶
Fixes and improvements¶
-
fby was throwing the value of length rather than the symbol`length on error.
-
upsert was seg faulting for sorted nested lists mapped from disk, since v2.8. e.g
q)b:get`:a set`s#(1 2;3 4);b,:4 5;b -
-19!x wrote invalid file headers for files of symbol vectors (type 11) since 3.6 2018.07.30, such that reading them would throw 'parse.
Such a damaged file can be fixed by resetting the type byte to 11h with q){y 1:@[read1 x;2;:;0x0b]}[`:old;`:new] -
hclose on a websocket did not allow send errors to be trapped during the flush of any pending data on that socket.
-
only accept a websocket connection if .z.ws is defined, otherwise return HTTP 501 code.
-
older client drivers would automatically retry a connect attempt, using a capability of v2.5, if the initial attempt failed.
These retries can be rejected at the server through setting the env var KX_MIN_CLIENT_CAPABILITY to 1. e.g. $KX_MIN_CLIENT_CAPABILITY=1 q -
upper was throwing type for mapped list (type 77), since kdb+3.6 2018.10.03. e.g.
q)enlist["ABC"]~upper get`:nested set enlist"abc" -
writing to files which reside on nfs might not report an i/o error.
-
the symbols in the value of the result of-26! might not have been interned. e.g.
q){x~`$string x}'[(-26!)[]]
2018.10.03¶
New¶
-
windows only: .z.p uses a more precise clock if it is available. e.g.
q)count distinct{.z.p}each til 1000
Fixes and improvements¶
-
further improve performance of lower and upper for vectors of char arrays and symbol vectors in some cases. e.g.
q)b:upper a:10000?`8;c:string a;d:string b;system each "ts:100 ",/:("lower each (a;b;c;d)";"upper each (a;b;c;d)") -
https responses could be incomplete. e.g.
q).z.ph:{.h.hy[`json;.j.j 100000000?.Q.a]} / q started with q -E 1 -p 5000 $curl -k https://localhost:5000
2018.09.26¶
New¶
-
added -27! as a more precise, builtin version of .Q.f. n.b. It is atomic and doesn't take \P into account. e.g.
q)("123456789.457";"123456790.457")~-27!(3i;0 1+2#123456789.4567)
Fixes and improvements¶
-
sorting a vector of longs which contained a 0N and an overall range <9e15 was incorrect. asc would throw 's-fail, iasc would return an incorrect permutation. e.g.
q)asc -1+0W+3 9000000000000000 1 -
fix lower for char arrays longer than 2B and speedup lowering symbols. e.g.
q)not{x~lower x}(1+0Wi)#.Q.A -
select .. where x in y was suboptimal for vectors when x had no attr and y had no u,p or g attr. e.g.
q)a:21526?b:-1008140?0Wi-1;system each "ts:10 ",/:("select from([]a)where a in b";"select from([]a)where([]b:a)in([]b)") -
signing scripts limited filename to 99 chars, now 254 chars.
q)system"_ ",1_ string(`$":",f:(252#"a"),".q")0:enlist"{2+2}[]";system"l ",f -
reduced number of stat calls when overwriting/appending to a file. e.g.
q)f:(hsym`$(first system["pwd"]),"/nstattest","/" sv string til 20)set();f set() -
improved performance of < and > for atom with `s#vector. e.g.
q)v:`s#til 10000000;system"ts:100 500000<v" -
each/eachright/eachleft could segfault when interrupted on splay or operating on malformed splays. e.g.
q)t:get`:notab/ set([]a:1 2 3;b:5 6 7);hdel`:notab/b;@[t,\:;enlist`a`b!3 4;{1b}] -
x uj y was not commutative for (). e.g.
q)()uj([]0 1)uj()
2018.09.10¶
Fixes and improvements¶
-
rollback change "reduced number of fstat system calls for file ops" from 2018.07.30.
-
listening on explicit addresses on multihomed hosts was not routing connections to the listening port correctly. e.g.
q)\p 192.168.0.1:5000 -
writing nested files of type 77 was not retaining the sort attribute. e.g.
q)`s~attr get`:f set`s#enlist 0 1
2018.08.24¶
New¶
-
extended xcol to support dict of src!target names for column rename. e.g.
q)`A`b`C~cols(`a`c!`A`C)xcol([]a:();b:();c:())
Fixes and improvements¶
-
upserting an empty to a splay was not closing the underlying files. e.g.
q)do[1000;`:t/ upsert([]())] -
opening a tls connection would report errors regarding certificate loading/initialization only on the first connect attempt. e.g.
q).Q.hg "https://www.google.com" -
dynamic loading of a custom shared lib via 2: had an unnecessary dependency on LD_LIBRARY_PATH/PATH. e.g.
q)`:libname 2:(`f;1) / if libname existed in the pwd but not in LD_LIBRARY_PATH/PATH, loading would fail under linux/windows -
a link column with domain of a partitioned table requires the encompassing table to be partitioned too. e.g.
q)select t.time from([]t:`trade!100 200 201) / could have seg faulted, now throws 'par -
improved performance of where for some distributions of booleans. e.g.
q)a:100000?0b;system"ts:1000 where a" -
save table as json did not accept keyed tables. e.g.
q)kt:([x:0 1 2]y:"abc");save`:kt.json -
added additional file integrity check for nested data.
-
hopen no longer auto-retries ipc connections using a lower capability; the retry was for ipc compatibility with pre-2012 kdb+v2.x releases.
-
writing nested files of type 77 was seg faulting if file permissions were insufficient. e.g.
q)`:/abctest set("ab";"cd") / assume can't write to root dir
2018.07.30¶
New¶
- improved performance of ltrim and rtrim.
Fixes and improvements¶
-
allow system"tshark"; was confused by system"ts..." for timing execution.
-
sorting an enum file which had a p attr could seg fault.
-
file write was not deleting the file## of the nested file group (file,file#,file##). e.g.
q)`:file set(`hello;"world");`:file set() / file## was not removed -
-19! was compressing type 0/log format files as type 77. e.g.
q)h:hopen`:log set();h enlist(`f;(.z.t;`a;10f;"some"));hclose h;-19!(`:log;`:logz;17;2;6);f:0N!;-11!`:logz -
reduced number of fstat system calls for file ops.
-
fixed seg fault for lookup on table with s attr, but without any attribute on first column. e.g.
q)(`s#([]1#enlist();1#0))?([]2 2#"a";1 2) -
was not preserving attribute on first column when applying `s# to a table. e.g.
q)`s`u~{(attr x;attr first flip x)}`s#([]`u#1 2 3;4 5 6) -
kdb+ was not sending the full chain of certs for TLS unless SSL_VERIFY_CLIENT was set to "YES".
-
fixed potential overflow for a mapped list with an attribute and more then 2 billion elements. e.g.
q)`:g77 1:(0b;`g#(1+0Wi)#0);get[`:g77][1]?0 0 1 -
reduced overhead of .z.W for when few msgs are queued.
2018.06.14¶
New¶
-
utilise attribute on a single column in a table when grouping. e.g.
q)a:([]`p#where til 1000;0D00:00:01*where til 1000);`x xgroup a
Fixes and improvements¶
-
now defers loading shared libraries related to file compression until [de]compression feature is utilized.
-
kdb+ could seg fault when grouping mapped data with p/g attr written by v2.8, and empty lists with s attr, since 3.6 2018.04.13.
-
kdb+ could seg fault when trying to select random rows from a missing partitioned or splayed table. e.g.
q)any("pn";"missingtable")~\:@[2?;flip`a`b!`missingtable;::] -
kdb+ wasn't loading chains of certificates from a cert file for ssl/tls.
-
-17!x (flip endianess of input file x) was ineffective since v3.0. Now throws 'nyi.
2018.06.01¶
New¶
-
added support for mapped nested floats to mmu/lsq/inv. e.g.
q)`:a set 30 30#90?1f;get[`:a]$30?1f
Fixes and improvements¶
-
appending to enums written by 3.5 which had a g attr resulted in a corrupted file. upsert/amend now blocked for 3.5 enum. e.g.
q)`:e4g set`g#`s4?`b`a`c; / use v3.5 to write out e4g q)e4g,:`s4?`a`b`c append using v3.6 corrupted e4g
2018.05.17¶
Fixes and improvements¶
- saving an atom in a list could erroneously throw 'type.
2018.05.16¶
First production release of kdb+ 3.6.
Fixes and improvements¶
-
with env var QUDSPATH="", q was unable to listen on a port, since 3.6t 2018.04.13. e.g.
$QUDSPATH="" q -p 5000
2018.05.14¶
Fixes and improvements¶
-
null symbol atom ` was stored incorrectly for nested data, since 3.6t 2018.05.04.
-
type 77 now supports all types except dynamic load/foreign object (type 112h). e.g.
q)x~get`:f set x:({};::;+;/;0+;0+1*;::';+/;+\;+':;::/:;::\:) -
x 1: y can write in mapped format if y is toplevel list, dict, table, projection or composition. e.g.
q)all{x~get`:f 1: x}each(2 1#0;`a`b!0 1;([]());0+;0+1*)
2018.05.10¶
Fixes and improvements¶
-
() upsert was not creating deep-copy-on-access elements since 3.6t 2018.05.04. e.g.
q)`:a set();{77 0h~(@x;@*x)}@.:upsert[`:a;(("ab";"cd");1 2)] -
type 77 now supports types 101 102 103h also. e.g.
q)77h=type get `:a set (::;+;/) -
x like y and x~/:y were slower for mapped nested chars since 3.6t 2018.05.04. e.g.
q)a:first x:get .[`:nestedChars;();:;1000000 12#97?" "];system"t x like a" -
`:splay/ set ([]x) failed for nested cols, since 3.6t 2018.05.04.
-
q.k - modifications to support type 77 with meta etc.
2018.05.04¶
NUC (Not Upwardly Compatible)¶
Not backward compatible. Changes existing behavior.
-
old mapped nested types (77h+t) are deprecated and read-only.
set now writes type 77h files for all generic list inputs except (). As before, set saves dictionaries and tables in 3.5-compatible format. number of old mapped nested files decreased to 30720 from 32767. Unlimited number of concurrently mapped type 77h files.
New¶
-
a new mappable type, 'mapped list' (77h) improves on existing mapped nested types (77h+t) by removing the uniformity restriction. e.g.
q)a:get`:a set (1 2 3;"cde"); b:get`:b set ("abc";"def") q)77 77h~(type a;type b) mapped lists' elements can be of any type, including lists, dictionaries, tables. e.g. q)a:get`:a set ((1 2;3 4);`time`price`vol!(.z.p;1.;100i);([]a:1 2;b:("ab";"cd"))) q)77 0h~(type a;type first a) a new write primitive alternative to 'set', `:a 1: x, allows mapped lists to nest within other mapped lists. for files written with 1:, vectors within all structures remain mapped, no matter the depth, and can be used without being copied to the heap. e.g. q)a:get`:a 1: ((1 2;3 4);([]time:1000?.z.p;price:1000?100.);([]time:1000?.z.p;price:1000?200)) q)77 77h~(type a;type first a) q).Q.w[]`used`mmap / 336736 40432 q)p:exec price from a[1] q).Q.w[]`used`mmap /336736 40432 N.B. 1. writing types 100 and >103 is nyi. 2. symbol vectors/atoms are automatically enumerated against file## and deenumerated (and therefore always copied) on access. e.g. q)`:file set((`a`b;`b`c);0 1) / symbols cause a 3rd file to be created, file##, which contains the enumeration domain 3. the underlying storage (file#) stays mapped as long as there exists a reference to any mapped object within. Hence, care should be taken when working with compressed data, as anything ever decompressed in a file would stay in memory until the last reference is gone. -
added .Q.ts[x;y] which allows \ts functionality on dot apply, x . y. e.g.
q).Q.ts[.Q.hg;enlist`:http://www.google.com]
Fixes and improvements¶
-
loading atomic enums from file was leaking memory. e.g.
q)get`:e set`sym?`a / observe leak via .Q.w[]`used
2018.04.23¶
New¶
-
saving an unmappable compound object with >2 billion elements as a single file is now supported. e.g.
q)`:f set t:([](1+prd 31#2)#"x"$til 256);t~get`:f
Fixes and improvements¶
-
now able to read and write 32bit-range enums in a v3.5 compatible format when contained in an unmappable compound object. e.g.
q)`:f set([]`sym?`a`b) / readable by v3.5 64bit-range enums are written in a format readable by v3.6+ only. -
atom@guid was throwing 'type but was not trappable. e.g.
q).[@;(();0Ng);::] -
upsert on 32bit enums was broken. e.g.
q)e4:get`:e4;e4,:e4 / where `:e4 is an enum file saved by v3.5 or prior
2018.04.13¶
New¶
-
added .Q.dtps and .Q.dpfts to allow specifying enum domain. e.g.
q)t:([]a:10?`a`b`c;b:10?10);.Q.dpfts[`:db;2007.07.23;`a;`t;`mysym]
Fixes and improvements¶
-
get httpurl was seg faulting, currently nyi. Use .Q.hg instead.
-
dirsymbol@handle was not recognizing \ for windows path. e.g.
q)(`$":c:\\q")`file -
now verifies that handles returned from .z.pd for distributed peach are ipc handles. e.g.
q).z.pd:`u#4 5 6i;{}peach 0 1 -
hopen`:unix://5000 was seg faulting when env var QUDSPATH="".
-
"B"$ was erroneously processing char value 0 as 1b. Only "1tTyYxX" are 1b. e.g.
q)0b~"B"$"c"$0 -
fix query slowdown for single column. e.g.
q)\ts:1000 select count i by x from([]til 10000) -
improve performance of group x when x has an attribute. e.g.
q)p:`p#asc 1000000?10000;system"ts:10 group p" -
set sort attr on result for distinct x when x is a list and has sort attr. e.g.
q)`s~attr distinct`s#0 0 1 1
2018.03.22¶
Fixes and improvements¶
-
appyling parted attribute to an on disk enum was seg faulting if there was no existing attribute on it. e.g.
q)`:e set`sym?`a`b;(`p#`sym$`p#`a`b)~@[`:.;`e;`p#]`e -
-3!x was not truncating resulting string correctly for enums with attributes. e.g.
q)system"c 20 10";"`p#`s$`.."~-3!`p#`s?`$'.Q.a -
applying sort attribute to a (deferred mapped) splayed table was throwing 's-fail. e.g.
q)`s#t:get`:t/ set asc([]0 1;2 3)
2018.03.17¶
New¶
-
ltime is now thread-safe.
-
setenv now interns strings, .e.g
q)`test;0N!.Q.w[]`syms`symw;setenv[`test;"value"];.Q.w[]`syms`symw -
improved performance of stringify (-3!x) on deeply nested data.
-
\o 0N now resets local time offset. e.g.
q)0N!.z.T;system"o 120";0N!.z.T;system"o 0N";.z.T -
Linux only - in the event of a SIGBUS, the stack will be printed along with the contents of /proc/self/maps.
Fixes and improvements¶
-
improve performance of update `g attr data. e.g.
q)n:1000000;t:([]a:`g#n?100;b:n?0b);system"ts update a:0 from t where not b" -
adjusting slave count to 0 was possible from a handle other than 0. e.g.
q)h"\\s 0" / setting of remote
2018.03.06¶
NUC (Not Upwardly Compatible)¶
Not backward compatible. Changes existing behavior.
-
improved the GUID hashing:
1) it now considers all bits of the guid 2) uses a new file format for guids with u,p or g attribute. This format is unreadable by previous versions 3) guid files from previous versions are still readble -
modified the new enum file format introduced in 3.6t 2018.02.07, since appending to compressed enum files was problematic.
New¶
-
allow t?t1 and t,t1 to accept t1 with a different order of columns than t. e.g.
q)0=([]1 2;3 4)?`x1`x!3 1 q)([]1 2 5;3 4 6)~([]1 2;3 4),`x1`x!6 5
Fixes and improvements¶
-
tightened the verification that .Q.k==.z.K, to avoid mismatching q.k with the wrong q binary.
-
enumerating a null atom cleared the enum domain, since 3.6t 2017.09.26. e.g.
q)s:`a`b`c;`sym?`;`a`b`c~s -
language hook mechanism was seg faulting if language did not define .x.e where x is the language. e.g.
q)system"touch f.k";system"f)1" -
hcount`:dir was reporting an unrelated error string on unix, since 3.4t 2015.09.25.
-
avg for char vector could seg fault if the vector contained a null. e.g.
q)81.5~avg 7500000#"abc "
2018.02.13¶
Fixes and improvements¶
-
SSL_ env vars were being ignored unless prefixed by KX_, since 3.6t 2018.02.07
-
enumerations with p attr from versions prior to 3.6t 2018.02.07 were not being queried correctly
-
appending to a file was not detecting some errors on file ops, since 3.6t 2018.02.07
2018.02.10¶
New¶
-
.Q.hg now accepts char vectors to avoid polluting the sym intern pool with transient strings. e.g.
q).Q.hg"https://www.google.ch/?gfe_rd=cr&dcr=0&ei=UQ9-WrOwJuGX8Qeewb-gBg"
Fixes and improvements¶
-
appending to a sym file was rewriting the file on each append, since v3.0. e.g.
q)`:file set 0#`;system"t do[10000;`:file upsert `a`b]" -
updated .Q.k from 3.5 to 3.6
-
peach was seg faulting if given an input vector with <2 billion elements
-
windows only - for a background process, a repl error triggered a continuous printing of the prompt
-
increased windows default native stack size from 1 to 8MB, same default as macos and linux
2018.02.07¶
NUC (Not Upwardly Compatible)¶
Not backward compatible. Changes existing behavior.
-
enums, and linked columns, now use 64bit indices:
- 64b enums are type 20 regardless of their domain - there is no practical limit to the number of 64b enum domains - 64b enums save to a new file format which is not readable by previous versions - 32b enums files from previous versions are still readable, use type space 21 thru 76 and all ops cast them to 64b - saving nested enums to disk is currently nyi; to be fixed in the near future -
added ajf and ajf0, to behave as v2.8 aj/aj0, i.e. they fill from lhs if rhs is null. e.g.
q)([]time:2#00:00:01;sym:`a`b;p:1 1;n:`r`s)~ajf[`sym`time;([]time:2#00:00:01;sym:`a`b;p:0 1);([]time:2#00:00:00;sym:`a`b;p:1 0N;n:`r`s)]
New¶
-
'assign error now has location information. e.g.
q)1+:2 / error shows caret under + -
give preference to KX_ prefix for the SSL_* environment variables to avoid clashes with other openssl based products. e.g.
the value for getenv`KX_SSL_CERT_FILE is higher than getenv`SSL_CERT_FILE for determining config.
Fixes and improvements¶
-
allow parsing of GUIDs wrapped in {}, a.k.a. Microsoft style GUIDs. e.g.
{(~)."G"$/:(x;"{",x,"}")}"aaaef973-d8ce-4c92-95b4-3635bb2d42d5" -
ipc messages with an invalid header length field of <8 bytes was corrupting memory resulting in a seg fault. Now throws 'badMsg.
-
added stack overflow check for .j.j (json serializer). e.g.
q)@[{.j.j x;0b};enlist/[100000;1];{"stack"~x}] / was seg faulting -
listening on 0.0.0.0 was not listening on any interface, other than the unix domain socket, twice. e.g.
q)\p 0.0.0.0:5010 -
kod licensed usage could seg fault if dns response was slow.
-
avg was not ignoring nulls wrt count for dictionaries. e.g.
q)all 1.5=first each avg each(1 0N 2;`a`b`c!1 0N 2;([]1 0N 2);([`a`b`c]1 0N 2))
2017.11.06¶
New¶
-
allow workspace limit to be increased at run-time, if it was initialized via the -w cmd line option. e.g.
q)system"w 128" / sets the -w limit to the larger of 128MB and the existing setting -
q.k - added .Q.ens[dir;table;name] to allow enumeration against domains (and therefore filename) other than`sym. e.g.
q)([]sym:`mysym$`a`b`c)~.Q.ens[`:db;([]sym:`a`b`c);`mysym] / enumerates against contents of `:mysym
Fixes and improvements¶
-
solaris only - tables could have erroneously passed a sorted check instead of throwing s-fail. e.g.
q)`s#([]`a`b`a;1 2 3) -
invalid (.e.g non-unique or partial) enum domains could cause a seg fault with grouped selects. e.g.
q)sym:`a`b;0!select by x,x1 from([]`sym!2 0N 2 0N;til 4;til 4) -
wrap csv header fields in "" if they contain a comma. e.g.
q)t~("JJJ";enlist",")0:","0:t:flip(`$("foo";"bar,baz";"quux"))!(1 2;3 4;5 6)
2017.10.30¶
Fixes and improvements¶
- multithreaded input queue mode no longer locks around accepting new connections.
2017.10.23¶
New¶
-
the parser date range has been extended, now supporting dates from 0001.01.01 to 9999.12.31. e.g.
q)("D"$"3001.01.01")~3001.01.01 n.b. date calculations assume proleptic gregorian calendar. Casting to timestamp from date or datetime outside of the timestamp supported year range result in +/-0Wp.
Fixes and improvements¶
-
out of range dates/datetimes now print to 0000.00.00/0000.00.00T00:00:00:.000. e.g.
q)"0000.00.00T00:00:00.000"~string "z"$0001.01.01-1 -
0: was throwing type if rhs was mapped nested char vectors. e.g.
q)`:testdata set("ab";"cde");([]ab:enlist"cde")~(enlist"*";enlist",")0:get`:testdata -
the new json serializer was not escaping object with type > 99. e.g.
q)"\"k){(*y)(1f-x)\\\\x*y}\""~.j.j(ema) -
q.k - made \l stricter:
1. only try to replace the root namespace with a dictionary, 'type otherwise 2. only try to execute hdb scripts from files matching "*.?"
2017.10.13¶
New¶
-
json serializer .j.j is now built-in native, and serializes int inf as their values, real/float inf as "inf" and ` as "". e.g.
q).j.j raze"hijef"$\:-0w 0n 0w -
timestamps are now serialized in json using a T delimiter. e.g.
q)"\"2017-10-04T16:20:02.936177000\""~.j.j 2017.10.04D16:20:02.936177000
Fixes and improvements¶
-
sort performance was poor for some distributions, with potential to seg fault, since 3.5t 2017.02.03. e.g.
q)f:{asc(2*x)#((floor x%7)#0),"j"$1e11*til x};value each "\\t f ",/:string 100000*1+til 5 -
char vector like enlist"*" was throwing 'type since 2017.09.25. e.g.
q)"abc"like enlist"*" -
flip could create a table with zero columns which could cause a seg fault later. Now throws 'rank. e.g.
q)@[flip;(0#`)!([]());"rank"~] -
kdb+ would seg fault when printing to console if on startup the environment variables LINES or COLUMNS was set to "".
-
q.k - .Q.hmb now uses builtin btoa for Basic Auth. e.g.
q).Q.hg`$":http://username:password@www.google.com"
2017.09.26¶
New¶
-
improved numerical stability of inv for ill-conditioned matricies. e.g.
q)(1 0f;0 1f)~{x mmu inv x}(5 500f;500 50001f) -
enable parse of ipv6 (and ipv4) using "G"$. e.g.
q)"G"$/:("2001:0db8:85a3:0000:0000:8a2e:0370:7334";"192.168.1.125") -
hopen is now a verb to allow passing char vectors instead of symbols, thereby avoiding interning of such symbols.
This is useful if embedding frequently changing tokens in the username or password fields. For ipc compatibility, it serializes to {hopen x}. e.g. q)hopen each(`:mysymbol;":mycharvector";`:localhost:5000;":localhost:5000";(`:localhost:5000;1000);(":localhost:5000";1000)) -
exposed builtin b64 encoder and sha1 as .Q.btoa and .Q.sha1. e.g.
q)"SGVsbG8gV29ybGQh"~.Q.btoa"Hello World!" q)0x2ef7bde608ce5404e97d5f042f95f89f1c232871~.Q.sha1"Hello World!" -
increased byte-code limits for locals=110, globals=110, locals+globals+constants<240, branch=65025.
-
json parser relaxed to parse infinity and nan. e.g.
q)0w 0w -0w -0w 0n 0n~.j.k each("infinity";"inf";"-Inf";"-Infinity";"NaN";"nan") -
improved performance of (list of char vectors) like char vector. e.g.
q)strings:string 1000000?100000?0Ng;s:rand strings;system"\ts:100 strings like s" -
allow user to save and restore state of rng. e.g.
q)x:system"S 0N";r:10?10;system"S ",string x;r~10?10 -
check that all rows are sorted in a table when applying sort attribute. e.g.
q)`s#([]1 1 2;3 2 1) / now throw 's-fail -
use binary search on sorted tables with small rhs (currently <65k), up to 10x faster. e.g.
q)c:([]s:1000000?`3;e:1000000?`1;p:1000000?10f);c1:select by s,e from c;c2:(`#key c1)!value c1;l:1001?key c1 q)system each("ts:1000 c1 l";"ts:1000 c2 l")
Fixes and improvements¶
-
upsert to a splayed table required columns to be the same as on disk. e.g.
q)(`:t/t/ set([]a:0 1;b:"ab"))upsert([]b:"cd";a:2 3) / was throwing 'mismatch -
on windows only, hopen with timeout could be erroneous if there was a TLS connection active.
-
on windows only, if kdb+ opened or accepted >64 connections and at least one of them used TLS, it could seg fault.
-
creating a new enumeration target with a null atom was creating an untyped list instead of a symbol vector. .e.g.
q)`x?`;(0#`)~x -
like was not returning matches for enumerations containing null for "*" match. e.g.
q)(0001b;1111b)~(`sym?`a`b`c`)like/:("";enlist"*") -
an error thrown from a function during multi-arg (>2 args) scan or each could leak memory. e.g.
q){$[x>2;'`e;x+y+z]}\[0;til 5;til 5] q){$[x>2;'`e;x+y+z]}'[til 5;til 5;til 5] -
min/max on small vectors with a `p attribute could be erroneous. e.g.
q)(~).(min;max)@\:/:{(`p#x;x)}"45" -
conditional operator inside a lambda now verifies it has a odd arg count, i.e. a value for the final false branch is present. e.g.
q){$[0;1;0;2]}[] / now throws 'cond. Should be {$[0;1;0;2;3]}[] -
additionally, updated the error message thrown for that case outside of a lambda from 'rank to 'cond. e.g
q)$[0;1;0;2] -
hopen for unix domain sockets was erroneously connecting the badly formatted `:unix://:4444 (should be `:unix://4444) through handle 0.
-
hopen without using a hostname was not setting Server_Name_Indication for tls correctly. e.g.
q)hopen`:tcps://:4444 / implicit localhost -
hopen with timeout was not working for tls connections (windows client only). e.g.
q)hopen(`:tcps://localhost:4444;2000) / if server busy, immediately threw 'hop. OS reports: A blocking operation is currently executing. -
pad was seg faulting if given 0W as input. Now throws 'limit. e.g.
q)"limit"~@[0W$;();::] -
more strict parsing of ip addresses. e.g.
q)0Ni~"I"$"127.a.b.1" -
creating a boolean through the c-api kb(I) function was storing input as given. Now it stores 0|1.
-
0N#dict was not throwing 'type for some inputs. e.g.
q)"type"~@[0N#;0 1!0 1;{x}] -
memory usage tally for used and mmap was incorrect when peach returned data which was mapped from disk, or larger than 32MB with -g 1 cmd line.
-
reassigning a view during its calculation could result in a seg fault. e.g.
q)a::@[value;`.a;a:1 2 3] -
improved performance of pattern select ... by sym from t where sym in ... with p or g attr on sym and few rows per distinct sym. e.g.
q)`:t/ set([]x:`p#til 10000000;y:10000000?0xff);z:-20?get`:t/x;system"ts select max y by x from get`:t where x in z" -
debugger caret positioning could be incorrect for update and partitioned select. e.g.
q)update 2#1 2 from([]1 2 3) q)select a,b from t / t is partitioned, with b missing -
{([;a])} was seg faulting. Now throws 'parse.
-
socket broadcast, -25!(handles;msg) was leaking a ref count on (::) which would cause a random seg fault later. e.g.
q)-25!(handles;msg);-16!(::) -
compressed messages were not length limit checked for older clients (c.o, or kdb+ prior to v3.4), causing the client to seg fault.
-
attributes were not being retained for enumerations which had a null. e.g.
q)all{x~attr`sym?x#``a}each``s`u`p`g -
improved find for larger vectors with attributes. e.g.
q)a:`g#til 100000;system"ts:100000 a?1 2 4" -
allow meta to work in namespaces other than root namespace - did not resolve enums correctly. e.g.
q)system"d .ns";f:{meta([]`sym?`a`b)};f[] -
debug caret was printing at the wrong location if tabs were present. e.g.
q)f:value"{{\t\t\t\t\t\t\"some very long and irrelevant code\"};1+`a}";f[] -
raze of a dictionary could throw 'type error when the value of the result is a mixed list. e.g.
q)d:(enlist 0)!enlist 0;e:1 2!`a`b;(0 1 2!(0;`a;`b))~raze(d;d;d;e) -
receiving an https POST could have thrown 'rcv error and closed the connection.
2017.06.15¶
New¶
-
added lz4hc as file compression algorithm #4. e.g.
q).z.zd:17 4 16;`:z set z:100000?200;z~get`:z -
added deferred response for incoming sync messages. -30!(::) indicates the response for the currently executing sync message will be explicitly sent later, via -30!(handle as int;isError as boolean;msg).