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
>
>
>
>

Reply via email to