[Bug 29044] New: array:sort does not define a total order when keys contain NaN

https://www.w3.org/Bugs/Public/show_bug.cgi?id=29044

            Bug ID: 29044
           Summary: array:sort does not define a total order when keys
                    contain NaN
           Product: XPath / XQuery / XSLT
           Version: Candidate Recommendation
          Hardware: PC
                OS: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Functions and Operators 3.1
          Assignee: mike@saxonica.com
          Reporter: josh.spiegel@oracle.com
        QA Contact: public-qt-comments@w3.org
  Target Milestone: ---
             Group: XSLXQuery_WG

Consider this query:

   let $a := (xs:float("NaN"), 1)
   let $b := (xs:float("NaN"), 2)
   return array:sort([$a, $b])

The result of this query is not well defined.

<quote>
 The order of members in the result is such that, given two members $A and $B:

 if (fn:deep-equal($key($A), $key($B)), then the relative order of $A and $B 
 in the output is the same as their relative order in the input (that is, 
 the sort is stable)

 if (deep-less-than($key($A), $key($B)), then $A precedes $B in the output. 
 The function deep-less-than is defined as the boolean result of the
expression:
 if (empty($A)) then exists($B)
 else if ($A[1] eq $B[1]) then deep-less-than(fn:tail($A), fn:tail($B))
 else $A[1] lt $B[1]
</quote>

* fn:deep-equals(data($a), data($b)) is false
* deep-less-than(data($a), data($b)) is false
* deep-less-than(data($b), data($a)) is false

Using deep-equal instead of eq may fix the problem:

  if (empty($A)) then exists($B)
  else if (deep-equal($A[1],$B[1]) then deep-less-than(fn:tail($A),
fn:tail($B))
  else $A[1] lt $B[1]

The expected result of above query would then be:

  [(xs:float("NaN"), 1), (xs:float("NaN"), 2)]

-- 
You are receiving this mail because:
You are the QA Contact for the bug.

Received on Friday, 7 August 2015 14:13:10 UTC