- From: <bugzilla@wiggum.w3.org>
- Date: Thu, 12 Oct 2006 10:25:04 +0000
- To: public-qt-comments@w3.org
- CC:
http://www.w3.org/Bugs/Public/show_bug.cgi?id=3818
Summary: Static typing of $input-
context1/works[1]/employee[1]/empnum[1]
Product: XPath / XQuery / XSLT
Version: Candidate 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
We've found that we can't statically type check:
(: insert-start :)
declare variable $input-context1 as document-node()? external;
(: insert-end :)
count(() is $input-context1/works[1]/employee[1]/empnum[1])
(XQTS test nodeexpression3).
The expression expands to:
count(op::is-same-node((),
fs:apply-ordering-mode(
fs:distinct-doc-order-or-atomic-sequence(
let $fs::seq as node()* :=
fs:apply-ordering-mode(
fs:distinct-doc-order-or-atomic-sequence(
let $fs::seq as node()* :=
fs:apply-ordering-mode(
fs:distinct-doc-order-or-atomic-sequence(
let $fs::seq as node()* := $input-context1 return
( let $fs::last := count($fs::seq) return
( for $fs::dot at $fs::pos in $fs::seq return
let $fs::seq := child::works return
( subsequence($fs::seq, 1, 1) )
)
)
)
) return
( let $fs::last := count($fs::seq) return
( for $:fs::dot at $fs::pos in $fs::seq return
let $fs::seq := child:::employee return
( subsequence($fs::seq, 1, 1) )
)
)
)
) return
( let fs::last := count($:s::seq) return
( for $:fs::dot at $:s::pos in $:fs::seq return
let :fs::seq := child:::empnum return
( subsequence($fs::seq, 1, 1) )
)
)
)
)
)
)
}
The sxpressions works[1], employee[1] and empnum[1] can all be typed as
element()?, (under the rules of 7.2.13). However the use of "let fs::seq as
node()*" means that fs:seq gets typed as node()*, rather than the more specific
type element()?.
By the end of this, we can only tell that:
$input-context1/works[1]/employee[1]/empnum[1]
is of type node()*, when it is obviously element()?.
In 4.8.3 Let Expression, the typing rule states that:
statEnv |- Expr1 : Type1
Type0 = [ SequenceType ]sequencetype
statEnv |- Type1 <: Type0
statEnv |- VarName of var expands to Variable
statEnv + varType(Variable1 => Type0 ) |- Expr2 : Type2
------------------------------------------------------------------------
statEnv |- let $VarName1 as SequenceType := Expr1 return Expr2 : Type2
i.e. $VarName1 gets treated as having type Type0, not the more specific type
that Type1. Shouldn't Variable1 have type Type1?
Received on Thursday, 12 October 2006 10:25:12 UTC