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
>