Formal Semantics: fs:convert-operand() erroneous?


the latest XQuery Formal Semantics defines the fs:convert-operand()
function in Section 6.1.3 [1].  In a nutshell, fs:convert-operand()
casts its first argument to the type of a given sencond argument, if it
had been a subtype of xdt:untypedAtomic before.  Otherwise the first
argument is returned unchanged.

The type of fs:convert-operand(), however, is defined as

 fs:convert-operand($actual as item *,
                    $expected as xdt:anyAtomicType)
     as xdt:anyAtomicType ?  .

Note that it allows an arbitrarily long sequence of items as its first
argument.  The return value, however, is a sequence of at most length

The specifications only consider the case where $actual has a length no
longer than one.  So the return value for $actual being a longer
sequence remains undefined.

fs:convert-operand() could easily be fixed by restricting $actual to an
optional item (item?).  This, however, would make queries such as XMark
11 [2] illegal:

for $p in fn:doc("auction.xml")/site/people/person return
  let $l :=
    for $i in document("auction.xml")/site/open_auctions/open_auction/initial
      where $p/profile/@income > (5000 * $i/text())
      return $i
      element items {
        attribute name { $p/name/text() }
        text { count ($l) }

Note the `5000 * $i/text()'.  $i/text() evaluates to node*.  The Formal
Semantics rule for Arithmetics [3] applies fn:data(), returning an
xdt:untypedAtomic* on the non-validated document.  If the first argument
of fs:convert-operand() were restricted to item? it could not be applied
to `$i/text()', making the above query illegal.

Jens Teubner


Jens Teubner
University of Konstanz, Department of Computer and Information Science
D-78457 Konstanz, Germany
Tel: +49 7531 88-4379     Fax: +49 7531 88-3577

Statistics show that most people are in
the majority, while a few are in the minority.
                         -- Nitin Borwankar

Received on Monday, 23 August 2004 15:22:23 UTC