[Bug 1314] New: fn:distinct-values should not accept incomparable types


           Summary: fn:distinct-values should not accept incomparable types
           Product: XPath / XQuery / XSLT
           Version: Last Call drafts
          Platform: PC
        OS/Version: Windows XP
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Functions and Operators
        AssignedTo: ashok.malhotra@oracle.com
        ReportedBy: chamberl@almaden.ibm.com
         QAContact: public-qt-comments@w3.org

The fn:distinct-values function (Section 15.1.6) eliminates duplicates from an 
atomized sequence, based on comparing values by the "eq" operator. However, it 
says "Values that cannot be compared, i.e. the eq operator is not defined for 
their types, are considered to be distinct." This is problematic for the 
following reasons:

(1) If incomparable values were actually compared by the "eq" operator, an 
error would result (for example, 7 eq "7" raises error XPTY0004.)

(2) An "order by" clause also raises an error (XPTY0004) if it encounters 
incomparable sort keys.

(3) The aggregation functions fn:avg, fn:min, fn:max, and fn:sum also raise an 
error (FORG0006) if they encounter incomparable sort keys.

(4) Implementations of fn:distinct-values based on sorting or hashing are not 
possible under the current definition because they do not accept heterogeneous 
input sequences.

In summary, the current specification of fn:distinct-values is inconsistent 
with the rest of the language and difficult to implement efficiently. The 
definition of fn:distinct-values should be made consistent with other functions 
and operators by raising an error if incomparable values are encountered. This 
will allow "order by" and fn:distinct-values to share a common efficient 

Proposal: In the definition of fn:distinct-values, replace the second sentence 
with the following: "If the input sequence contains any two values for which 
the eq operator is not defined, a type error is raised [err:FORG0006]." Also 
add an example: fn:distinct-values(1, 2.3, "Hello") raises err:FORG0006.

Received on Monday, 9 May 2005 22:02:09 UTC