Hi Mauro, Mi dispiace di averti fatto aspettare.
Your test case was very helpful for reproducing the issue. The problem was caused by the combination of mixupdates and function-lookup. I hope that the issue is resolved with the latest stable snapshot [1] (it’s time to give it a TLA… maybe LSS?). Ciao, Christian [1] http://files.basex.org/releases/latest/ On Mon, Apr 27, 2020 at 1:04 PM Mauro Mugnaini <themax...@gmail.com> wrote: > > Dear Christian, > About this problem we discover another issue that is causing us some troubles. > In the same scenario of calling RESTXQ updating functions discovered > dynamically in a basex with MIXUPDATES turned on: if a reading function is > called on the same DB while an updating function is storing some content in > the DB the DB will be corrupted. We performed some tests and some times we > get an OutOfMemoryError exception, some time an > ArrayIndexOutOfBoundsException with the result that some “rubbish” data gets > stored into the DB (e.g. standalone attributes). > I’ll provide you a SSCE [1] and the inserting function [2] we used to confirm > the problem. During the save it is sufficient to call the read via rest > several times with [3] to cause the problem. We tested on both last release > (adding the “updating” prefix before the looked up function) and latest > nightly build. > > All my best, > > Mauro > > [1] test.xqm file > > module namespace _ = 'urn:test'; > > declare > %rest:path("save") > %output:method("json") > %output:media-type('application/json') > %rest:POST("{$resource}") > function _:create($resource as node()) { > function-lookup(xs:QName("db:add"), 3)("test", $resource, random:uuid()) > }; > > declare > %rest:path("readall") > %output:method("json") > %output:media-type('application/json') > %rest:GET > function _:readall() { > <json type="object">{ > for tumbling window $in-window in function-lookup(xs:QName("db:open"), > 1)("test") > start $first at $s when $s = 1 > end $last at $e when $e - $s = 10 - 1 > return $in-window > }</json> > }; > > [2] > distinct-values(for $i in 1 to 10000 > let $res := > http:send-request(<http:request method="post"> > <http:body media-type="application/fhir+json"/> > </http:request>, "http://localhost:8984/save", '{ > "resourceType": "Encounter", > "status" : "finished" > }') > return string($res[1]/@status)) > > [3] http://localhost:8984/readall > > > Il giorno 31 mar 2020, alle ore 14:14, Christian Grün > > <christian.gr...@gmail.com> ha scritto: > > > > Dear Mauro, > > > > The combination of higher-order functions and MIXUPDATE led to a wrong > > assignment of static properties of your updating expression. I have > > made the compilation step more rigid: If a dynamic function call is > > found, and if mixing updates is enabled, the function will now always > > be tagged as an updating function. Feel free to check out the latest > > stable snapshot [1]. > > > > If you want to stick with 9.3.2, you can prefix the function lookup > > call with an additional "updating" keyword: > > > > updating fn:function-lookup(fn:QName('urn:ns:impl2', 'store'), > > 1)($resource) > > > > Cari saluti all’ Italia; our hearts are with you, > > Christian > > > > [1] http://files.basex.org/releases/latest/