- From: <bugzilla@wiggum.w3.org>
- Date: Tue, 23 Jan 2007 09:29:40 +0000
- To: public-qt-comments@w3.org
- CC:
http://www.w3.org/Bugs/Public/show_bug.cgi?id=4273 Summary: [FS] data on element() Product: XPath / XQuery / XSLT Version: Proposed Recommendation Platform: PC OS/Version: Windows XP Status: NEW Severity: normal Priority: P2 Component: Formal Semantics AssignedTo: simeon@us.ibm.com ReportedBy: tim@cbcl.co.uk QAContact: public-qt-comments@w3.org Consider the query: declare variable $x as element(a, xs:integer) external; declare variable $y as element() := $x; let $z as xs:integer := fn:data($y) return $z; >From FS 3.5.4, we know that: element(a, xs:integer) = element a of type xs:integer element() = element * of type xs:anyType >From FS 3.5.1, we know that: xs:integer <: xs:anyType >From FS 5.14, we know that: 1. the static type of $x is element a of type xs:integer 2. the static type of $y is element * of type xs:anyType $y is assignable from $x because: element a of type xs:integer <: element * of type xs:anyType Now consider the type checking of fn:data($y). This depends on the "data on" judgements in FS 7.2.6. As these judgements get quite involved, I refer to XQuery 2.5.2, point 4a: "For an element node, the relationship between typed value and string value depends on the node's type annotation, as follows: If the type annotation is xs:untyped or xs:anySimpleType or denotes a complex type with mixed content (including xs:anyType), then the typed value of the node is equal to its string value, as an instance of xs:untypedAtomic" Therefore fn:data($y) is of type xs:untypedAtomic. Now, not(xs:untypedAtomic <: xs:integer) and therefore "let $z as xs:integer := fn:data($y) return $z;" will fail to type check. Consider the differences if the argument to fn:data had been $x instead of $y. let $z as xs:integer := fn:data($x) return $z; >From FS 7.2.6, "When applied to an element type whose type annotation denotes a simple type or a complex type of simple content, data on returns the element's simple type." So fn:data($x) is of type xs:integer, and therefore the query will type check correctly. The strange thing is that $x and $y are the same value. The only difference is their static types at type check time - during evaluation their dynamic types will be identical. Thus an implementation which only performs type checking at run time will execute both queries happily. Have I made some mistake, or is there a problem here?
Received on Tuesday, 23 January 2007 09:29:52 UTC