Dear Johannes, Thanks for the reproducible test case. The bug (a too eager merge of combined range expressions) was fixed and a new snapshot is available [1,2].
Cheers Christian [1] https://github.com/BaseXdb/basex/issues/1744 [2] http://files.basex.org/releases/latest/ On Thu, Oct 24, 2019 at 10:54 AM Johannes Echterhoff <echterh...@interactive-instruments.de> wrote: > > Hello, > > I’m experiencing some strange behavior when executing the following query in > the BaseX 9.2.4 GUI (nevermind the awkward query structure – that is just to > be able to inspect the results of the individual evaluation steps): > > > > let $t := <x>200.0000</x> > > let $num := number($t) > > let $gt5000 := $num gt 5000 > > let $ltMinus5000 := $num lt -5000 > > return $gt5000 or $ltMinus5000 > > > > The result is true, although it should be false. > > > > The compilation and optimization logs for this query in the GUI tell us the > following: > > ---------- > > Compiling: > > - rewrite > comparison to range comparison: ($num_1 > 5000) -> ($num_1 >= > 5000.000000000001) > > - rewrite 'gt' comparison to range comparison: ($num_1 gt 5000) -> ($num_1 >= > 5000.000000000001) > > - pre-evaluate unary expression to xs:integer item: -5000 > > - rewrite < comparison to range comparison: ($num_1 < -5000) -> ($num_1 <= > -5000.000000000001) > > - rewrite 'lt' comparison to range comparison: ($num_1 lt -5000) -> ($num_1 > <= -5000.000000000001) > > - inline $gt5000_2 > > - inline $ltMinus5000_3 > > - simplify or: (true()) > > - pre-evaluate or to xs:boolean item: (true()) -> true() > > - remove unused variable $num_1 > > - remove unused variable $t_0 > > - simplify FLWOR expression: true() > > Optimized Query: > > true() > > ---------- > > > > When the return statement is changed to “return > ($num,$gt5000,$ltMinus5000,$gt5000 or $ltMinus5000)” then the result of the > boolean operation (last element of the result sequence) is false, as expected. > > The GUI log then is: > > ---------- > > Compiling: > > - rewrite > comparison to range comparison: ($num_1 > 5000) -> ($num_1 >= > 5000.000000000001) > > - rewrite 'gt' comparison to range comparison: ($num_1 gt 5000) -> ($num_1 >= > 5000.000000000001) > > - pre-evaluate unary expression to xs:integer item: -5000 > > - rewrite < comparison to range comparison: ($num_1 < -5000) -> ($num_1 <= > -5000.000000000001) > > - rewrite 'lt' comparison to range comparison: ($num_1 lt -5000) -> ($num_1 > <= -5000.000000000001) > > Optimized Query: > > let $t_0 := element x { ("200.0000") } let $num_1 := number($t_0) let > $gt5000_2 := ($num_1 >= 5000.000000000001) let $ltMinus5000_3 := ($num_1 <= > -5000.000000000001) return ($num_1, $gt5000_2, $ltMinus5000_3, ($gt5000_2 or > $ltMinus5000_3)) > > ---------- > > > > Am I missing something, or could this be a bug in BaseX 9.2.4? With BaseX > 9.0.2, both queries (with the different return statements) returned the > expected value false for the boolean operation. > > > > Best regards, > > Johannes > > > >