- From: <bugzilla@wiggum.w3.org>
- Date: Sat, 01 Oct 2005 15:52:11 +0000
- To: public-qt-comments@w3.org
- Cc:
http://www.w3.org/Bugs/Public/show_bug.cgi?id=2324
Summary: Value/General comparisons: type promotion for
xs:anyURI/numeric
Product: XPath / XQuery / XSLT
Version: Last Call drafts
Platform: Other
OS/Version: Linux
Status: NEW
Severity: normal
Priority: P2
Component: XPath
AssignedTo: chamberl@almaden.ibm.com
ReportedBy: frans.englich@telia.com
QAContact: public-qt-comments@w3.org
Hello,
The treatment of operands in value comparisons does not include a type
promotion of xs:anyURI to xs:string. One result of this is that the following
expression fails to compile:
xs:string("example.org/") eq xs:anyURI("example.org/")
due to no eq-operator existing between those two types.
If this is intentional, I can understand the design since it is a stricter type
checking in the spirit of much else in XPath 2.0.
This was first brought up in a thread[1] on the saxon-help list, where Michael
Kay added the following comments:
<quote>
I' confident it was the intention of the working group that value
comparisons between anyURI and string should work, for example this is
necessary to retain backwards compatibility for the expression
<xsl:if test="namespace-uri() = 'http://thing/'">
(if URI-to-string promotion doesn't work for value comparisons, then it
doesn't work for general comparisons either).
But I agree, if you follow the spec closely, there's nothing that causes
type promotion to kick in here.
</quote>
I think `namespace-uri() = 'http://thing/'` do work because the way operands in
a general comparison are treated is specified differently, and are not
following the rules of value comparisons. More specifically, the expression
`namespace-uri() = 'http://thing/'` works because when backwards compatibility
is true, 4.b is invoked which reads: "If at least one of the two atomic values
is an instance of xs:string, or if both atomic values are instances of
xdt:untypedAtomic, then both atomic values are cast to the type xs:string."
This leads me back to what actually is the issue(s). I claim this:
* The specifications do not have any errors in this matter. The value
comparison is as strict as it is intended to be, and there is no backwards
compatibility problems with for example general comparisons.
* Saxon have bugs in this area. For example, it does not flag
`xs:string("example.org/") eq xs:anyURI("example.org/")` as
a compile time error.
***
A related issue:
The expression `xs:float(3) eq xs:double(3)` should fail to compile due to no
numeric promotion being specified. Instead it has the note paragraph in the
fourth rule. This can be contrasted to operand treatment for function calls
where numeric promotion is explicitly specified. However, section "B.2 Operator
Mapping" specifies numeric promotion:
<quote>
A numeric operator may be validly applied to an operand of type AT if
type-matches(ET, AT) is true where ET is any of the four numeric types. If the
result type of an operator is listed as numeric, it means "the first type in
the ordered list (xs:integer, xs:decimal, xs:float, xs:double) into which all
operands can be converted by subtype substitution and type promotion."
</quote>
I wonder what that clause applies to; section "3.5.1 Value Comparisons" refers
to "B2 Operator Mapping" although not explicitly mentioning the numeric
promotion. I think it is intended to be for function calls, "For each numeric
item in the atomic sequence that can be promoted to the expected atomic type
using numeric promotion as described in B.1 Type Promotion, the promotion is
done," but I would say it can easily be misinterpreted whether it applies for
value comparisons as well.
I suggest the editorial change that section "3.5.1 Value Comparisons" is
updated to either explicitly refer to section B.1 Type Promotion(similar to how
3.1.5 Function Calls do) /if/ numeric promotion is of interest, and if it is
not, that there is an example that clarifies by showing an expression that
fails to compile "xs:float(3) eq xs:double(3)"(error code XPTY0004).
Another possible editorial is to remove the "global" numeric promotion clause
in "B.2 Operator Mapping" and put it where it's needed, such that the "What
does it apply to?"-problem goes away.
Cheers,
Frans
1.
http://sourceforge.net/mailarchive/message.php?msg_id=13149064
Received on Saturday, 1 October 2005 15:52:22 UTC