Re: [basex-talk] Found problems with map:for-each
Hi Christian, thank you very much for your very quick response and for fixing the issue. Greetings Il giorno lun 19 feb 2024 alle ore 19:20 Christian Grün < christian.gr...@gmail.com> ha scritto: > Hi Vincenzo, > > Thanks for your observation and the easily reproducible test case; we’ve > uploaded a new stable snapshot with a bug fix. > > Please note that it’s generally risky to explicitly return empty > sequences, as the optimizer will always try to get rid of code that may not > contribute to the final result (we try hard, though, to keep code alive > that has side effects, such as file:write-binary). In the given case, you > could simply rewrite your code as follows: > > let $files := map {"hello1.txt" : ... } > return map:for-each($files, function($filename, $content) { > file:write-binary($filename, $content, 0) > }) > > Ciao, > Christian > > [1] https://files.basex.org/releases/latest/ > > > > On Mon, Feb 19, 2024 at 4:51 PM Vincenzo Cestone > wrote: > >> Hi all, >> >> with the basex 10.7 version (but even in 9.6 version I have the same >> issue) I found that the following code wont work as expected: >> (: It wont work :) >> let $files := map {"hello1.txt" : xs:base64Binary('SGVsbG8gd29ybGQ='), >> "hello2.txt" : xs:base64Binary('SGVsbG8gd29ybGQ=')} >> let $w := map:for-each($files, function($filename, $content) { >> file:write-binary($filename, $content, 0) >> }) >> return () >> >> that is, it will not write the two files hello1.txt and hello2.txt in the >> basex_home/bin folder. >> >> But, if you return $w instead: >> (: It works :) >> let $files := map {"hello1.txt" : xs:base64Binary('SGVsbG8gd29ybGQ='), >> "hello2.txt" : xs:base64Binary('SGVsbG8gd29ybGQ=')} >> let $w := map:for-each($files, function($filename, $content) { >> file:write-binary($filename, $content, 0) >> }) >> return $w >> >> With a similar implementation, with the classic FLWOR, the issue does not >> arise, even if I return the empty sequence: >> (: It works :) >> let $files := map {"hello1.txt" : xs:base64Binary('SGVsbG8gd29ybGQ='), >> "hello2.txt" : xs:base64Binary('SGVsbG8gd29ybGQ=')} >> let $w := for $filename in map:keys($files) >> return file:write-binary($filename, map:get($files, $filename), 0) >> return () >> >> that is it will write two files hello1.txt and hello2.txt in >> basex_home/bin folder. >> >> Note that the files in the examples above are for demonstration purposes, >> however in my code they are actually binary files. >> My java version is a Oracle JDK 17 >> >> This problem also occur to others? >> >> Thanks, >> Vincenzo >> >
[basex-talk] Found problems with map:for-each
Hi all, with the basex 10.7 version (but even in 9.6 version I have the same issue) I found that the following code wont work as expected: (: It wont work :) let $files := map {"hello1.txt" : xs:base64Binary('SGVsbG8gd29ybGQ='), "hello2.txt" : xs:base64Binary('SGVsbG8gd29ybGQ=')} let $w := map:for-each($files, function($filename, $content) { file:write-binary($filename, $content, 0) }) return () that is, it will not write the two files hello1.txt and hello2.txt in the basex_home/bin folder. But, if you return $w instead: (: It works :) let $files := map {"hello1.txt" : xs:base64Binary('SGVsbG8gd29ybGQ='), "hello2.txt" : xs:base64Binary('SGVsbG8gd29ybGQ=')} let $w := map:for-each($files, function($filename, $content) { file:write-binary($filename, $content, 0) }) return $w With a similar implementation, with the classic FLWOR, the issue does not arise, even if I return the empty sequence: (: It works :) let $files := map {"hello1.txt" : xs:base64Binary('SGVsbG8gd29ybGQ='), "hello2.txt" : xs:base64Binary('SGVsbG8gd29ybGQ=')} let $w := for $filename in map:keys($files) return file:write-binary($filename, map:get($files, $filename), 0) return () that is it will write two files hello1.txt and hello2.txt in basex_home/bin folder. Note that the files in the examples above are for demonstration purposes, however in my code they are actually binary files. My java version is a Oracle JDK 17 This problem also occur to others? Thanks, Vincenzo
Re: [basex-talk] Issue with db:add via restxq in 8.4.2
Hi Christian, to give more details, I can tell you that with BaseX 8.4.2 doesn't happens. Moreover in the BaseX843-20160407 release happens even if I call the restxq with the 1 value: no recursion. 2016-04-08 14:42 GMT+02:00 Christian Grün : > Hi Vincenzo, > > This looks like a classical stack overflow issue (the same would > happen in Java). I am pretty sure it also happened with earlier > releases of BaseX. To fix this, you’ll rewrite your query for tail > recursion [1], use fold-left [2], or increase your Java stack trace > with the -Xss flag [3]. > > Hope this helps, > Christian > > [1] https://en.wikipedia.org/wiki/Tail_call > [2] http://docs.basex.org/wiki/Higher-Order_Functions#fn:fold-left > [3] > https://blogs.oracle.com/saas-fusion-app-performance/entry/how_set_stack_size_to > > > > On Fri, Apr 8, 2016 at 2:37 PM, Vincenzo Cestone > wrote: > > Thank you Christian, > > > > I checked the issue of the subject with the latest release and now it is > > working. > > But the BaseX843-20160407 release introduces a different issue > (supposedly), > > that is a java.lang.StackOverflowError exception you can reproduce > > implementing a restxq with a recursive function, as in the following > > example: > > --- > > module namespace api = "urn:api"; > > > > declare function api:fact($val) { > > if ($val = 1) then 1 > > else $val * api:fact($val - 1) > > }; > > > > declare > > %rest:path('myapi/{$v}') > > %rest:GET > > function api:impl_GET($v) { > > {api:fact($v)} > > }; > > --- > > Regards, > > Vincenzo > > > > 2016-04-06 15:48 GMT+02:00 Christian Grün : > >> > >> Il problema è risolto [1,2]; grazie di nuovo. > >> > >> [1] https://github.com/BaseXdb/basex/issues/1281 > >> [2] http://files.basex.org/releases/latest/ > >> > >> > >> > >> On Tue, Apr 5, 2016 at 12:53 PM, Christian Grün > >> wrote: > >> > Thanks Vincenzo, > >> > > >> > I could reproduce the problem [1], and we’ll fix it soon. > >> > > >> > Generally, I’d recommend you to avoid declaration of variables that > >> > will never be used. You could rewrite your code as follows: > >> > > >> >db:add('testdb', , '111.xml'), > >> > > >> > > >> > Hope this helps, > >> > Christian > >> > > >> > [1] https://github.com/BaseXdb/basex/issues/1281 > >> > > >> > > >> > > >> > On Mon, Apr 4, 2016 at 10:30 AM, Vincenzo Cestone < > v.cest...@gmail.com> > >> > wrote: > >> >> Hi guys, > >> >> > >> >> in the new basex 8.4.2 version I cannot write on the db via restxq. > >> >> > >> >> For example if you create an empty 'testdb', > >> >> set in the .basex conf file the option MIXUPDATES = true, > >> >> and call the '/dbaddtest' restxq implemented as in the following: > >> >> --- > >> >> module namespace o = "test"; > >> >> > >> >> declare > >> >> %rest:path("/dbaddtest") > >> >> %rest:GET > >> >> function o:dbaddtest() { > >> >> let $o := db:add('testdb', , '111.xml') > >> >> return > >> >> }; > >> >> --- > >> >> it will not work in the basex 8.4.2 i.e. the document is not added to > >> >> the > >> >> db, but it will return without errors. > >> >> On the contrary the db:add executed in the BaseX.jar client is > working > >> >> well. > >> >> > >> >> And also the above restxq code is working as expected in the basex > >> >> 8.3.1 > >> >> version. > >> >> > >> >> Thank you in advance. > >> >> > >> >> Regards, > >> >> Vincenzo > >> >> > >> >> > > > > >
Re: [basex-talk] Issue with db:add via restxq in 8.4.2
Thank you Christian, I checked the issue of the subject with the latest release and now it is working. But the BaseX843-20160407 release introduces a different issue (supposedly), that is a java.lang.StackOverflowError exception you can reproduce implementing a restxq with a recursive function, as in the following example: --- module namespace api = "urn:api"; declare function api:fact($val) { if ($val = 1) then 1 else $val * api:fact($val - 1) }; declare %rest:path('myapi/{$v}') %rest:GET function api:impl_GET($v) { {api:fact($v)} }; --- Regards, Vincenzo 2016-04-06 15:48 GMT+02:00 Christian Grün : > Il problema è risolto [1,2]; grazie di nuovo. > > [1] https://github.com/BaseXdb/basex/issues/1281 > [2] http://files.basex.org/releases/latest/ > > > > On Tue, Apr 5, 2016 at 12:53 PM, Christian Grün > wrote: > > Thanks Vincenzo, > > > > I could reproduce the problem [1], and we’ll fix it soon. > > > > Generally, I’d recommend you to avoid declaration of variables that > > will never be used. You could rewrite your code as follows: > > > >db:add('testdb', , '111.xml'), > > > > > > Hope this helps, > > Christian > > > > [1] https://github.com/BaseXdb/basex/issues/1281 > > > > > > > > On Mon, Apr 4, 2016 at 10:30 AM, Vincenzo Cestone > wrote: > >> Hi guys, > >> > >> in the new basex 8.4.2 version I cannot write on the db via restxq. > >> > >> For example if you create an empty 'testdb', > >> set in the .basex conf file the option MIXUPDATES = true, > >> and call the '/dbaddtest' restxq implemented as in the following: > >> --- > >> module namespace o = "test"; > >> > >> declare > >> %rest:path("/dbaddtest") > >> %rest:GET > >> function o:dbaddtest() { > >> let $o := db:add('testdb', , '111.xml') > >> return > >> }; > >> --- > >> it will not work in the basex 8.4.2 i.e. the document is not added to > the > >> db, but it will return without errors. > >> On the contrary the db:add executed in the BaseX.jar client is working > well. > >> > >> And also the above restxq code is working as expected in the basex 8.3.1 > >> version. > >> > >> Thank you in advance. > >> > >> Regards, > >> Vincenzo > >> > >> >
[basex-talk] Issue with db:add via restxq in 8.4.2
Hi guys, in the new basex 8.4.2 version I cannot write on the db via restxq. For example if you create an empty 'testdb', set in the .basex conf file the option MIXUPDATES = true, and call the '/dbaddtest' restxq implemented as in the following: --- module namespace o = "test"; declare %rest:path("/dbaddtest") %rest:GET function o:dbaddtest() { let $o := db:add('testdb', , '111.xml') return }; --- it will not work in the basex 8.4.2 i.e. the document is not added to the db, but it will return without errors. On the contrary the db:add executed in the BaseX.jar client is working well. And also the above restxq code is working as expected in the basex 8.3.1 version. Thank you in advance. Regards, Vincenzo