Hi Christian,

Your explanation is helpful. The test scenarios that I have do need to read and 
write data.

Currently it is possible to have a function annotated with %unit:before that 
performs updates to prepare databases for a %unit:test function.  For example:

module namespace t = "test";

declare %unit:before("t:test02") %updating function t:test01 () {
  db:create("test")
};

declare %unit:before("t:test03") %updating function t:test02 () {
  db:put-value("test", 1 to 10, "numbers")
};

declare %unit:test function t:test03 () {
  unit:assert(db:get-value("test", "numbers") = (1 to 10))
};


In a similar way, would it be possible to have a %unit:before function run code 
that uses job:execute, which may perform updates, and then have a %unit:test 
function verify the results, and avoid a deadlock? I'm not sure if this would 
be any easier than analyzing XQUnit functions to set a more fine granular lock 
as you described. I tried this and it resulted in a deadlock:

module namespace t = "test";

declare %unit:before("t:test02") function t:test01 () {
  job:execute('db:create("test")')
};

declare %unit:before("t:test03") function t:test02 () {
  job:execute('db:put-value("test", 1 to 10, "numbers")')
};

declare %unit:test function t:test03 () {
  unit:assert(db:get-value("test", "numbers")) = (1 to 10)
};


Perhaps a different approach could be to create tests using BaseX's 
client/server architecture: have XQUnit tests run in a BaseX client, and have 
code under test run in BaseX server facilitated by a set of RESTXQ functions.

Many thanks,
Vincent


_____________________________________________

Vincent M. Lizzi

Head of Information Standards | Taylor & Francis Group

[email protected]<mailto:[email protected]>

Time zone: US Eastern

[cid:ccdbe40b-697a-4a46-8940-d2f45e996071]<https://outlook.office.com/bookwithme/user/[email protected]?anonymous&ep=owaSlotsEmailSignature>
Book time to meet with 
me<https://outlook.office.com/bookwithme/user/[email protected]?anonymous&ep=owaSlotsEmailSignature>


________________________________
From: Christian Grün <[email protected]>
Sent: Monday, February 2, 2026 10:37 AM
To: Christian Grün via BaseX-Talk <[email protected]>; Lizzi, 
Vincent <[email protected]>
Subject: AW: job:execute with unit:test stalls

Hi Vincent,

I’m glad to see that job:execute finds its use in the wild.

As you have already discovered, care needs to be taken when updates are 
performed: Code that is executed with this function is started as a separate 
query job, which will be registered and run once there is no other updating 
process. When the parent expression is updating, this causes a deadlock.

If tests are executed (via the TEST command, via -t on command line, etc), a 
global write lock is set – which means that an invocation of job:execute inside 
the test is doomed to stall. One way out could be to analyze all XQUnit 
functions and set a more fine granular lock; but I assume your tests will not 
only perform main-memory operations, but read and possibly write data, too?

Best,
Christian

________________________________
Von: Lizzi, Vincent via BaseX-Talk <[email protected]>
Gesendet: Donnerstag, 29. Januar 2026 20:55
An: Christian Grün via BaseX-Talk <[email protected]>
Betreff: [basex-talk] job:execute with unit:test stalls

Hi BaseX team,

The new job:execute function in BaseX 12 is incredibly useful. Using 
job:execute, it's now possible to have a query that fetches data, dynamically 
computes the names of databases, creates the databases, populates the 
databases, and then reads from the same databases, all contained in one query 
or module!!! This can greatly simplify processes that previously required 
multiple steps.

I'm running into trouble when trying to use %unit:test to test code that uses 
job:execute. Running the test causes a deadlock, even though the code works 
correctly when run on its own.

Here is a small example based on the example in the documentation 
https://docs.basex.org/main/Job_Functions#job:execute<https://docs.basex.org/main/Job_Functions#job:execute>

This query produces "true" when run in BaseX GUI.

job:execute('db:create("test")'),
job:execute('db:put-value("test", 1 to 10, "numbers")'),
job:execute('db:get-value("test", "numbers")') = (1 to 10)

After adding %unit:test and unit:assert, when this test is run in BaseX GUI it 
stalls (until I click Stop to interrupt the process).

module namespace t = "test";
declare %unit:test function t:test01 () {
  job:execute('db:create("test")'),
  job:execute('db:put-value("test", 1 to 10, "numbers")'),
  unit:assert(job:execute('db:get-value("test", "numbers")') = (1 to 10))
};

Should this work, or am I missing something?

The documentation mentions to be careful to avoid deadlocks with updating 
queries. I've also found that a deadlock can occur when the main query uses 
fn:doc even if unrelated to job:execute, but this can be solved by wrapping 
fn:doc in job:execute. I haven't found a way to work around deadlocks that 
occur with %unit:test.  I'm using BaseX version 12.2.

Many thanks,
Vincent


______________________________________________

Vincent M. Lizzi

Head of Information Standards | Taylor & Francis Group

E-Mail: 
[email protected]<mailto:[email protected]>

Web: www.tandfonline.com<http://www.tandfonline.com/>

Time zone: US Eastern



Taylor & Francis is a trading name of Informa UK Limited,

registered in England under no. 1072954



"Everything should be made as simple as possible, but not simpler."



[cid:498c7d70-ddef-4485-9ad7-484411b1c0f5]<https://outlook.office.com/bookwithme/user/[email protected]?anonymous&ep=owaSlotsEmailSignature>
Book time to meet with 
me<https://outlook.office.com/bookwithme/user/[email protected]?anonymous&ep=owaSlotsEmailSignature>


Information Classification: General

Information Classification: General

Reply via email to