# XQuery Update 1.0

Saxon 9.1 implements the Candidate Recommendation for XQuery Update 1.0. All features, including optional features, are implemented.

Update is currently supported only on documents built using the `linked` tree model.

There are several limitations worth noting:

- The specification requires that updates should be atomic: that is, if any failure occurs, the original document is restored to its original state. Saxon meets this requirement unless revalidation is requested. If failures occur during the revalidation phase, these cannot currently be rolled back. Of course, this only affects the in-memory copy of the document; the application should be organized so that in this situation it is possible to revert to the copy on disk.

- The specification requires that node identity should be preserved across updates. The extent to which this requirement is met by Saxon is debatable. Saxon allows several Java objects to represent the same node. With the linked tree this applies in particular to attribute nodes: two requests to get all the attributes of a node will return different Java objects, though comparisons using `equals()` or `isSameNodeInfo()` will reveal that they refer to the same nodes. After an update, it is in general not safe to continue using existing `NodeInfo` objects, and the effect of doing so is undefined. This means that it is impossible to determine in any reliable way whether the old nodes have the same identity as the new nodes. In practice, with the linked tree implementation, it is safe to continue using variables that refer to element nodes (where there is always one Java object per node), but it is not safe in the case of attribute nodes.

- The `put()` function is implemented using the same run-time support code as `xsl:result-document`, and it currently imposes similar restrictions: for example, it must not be called from within a variable initialization or function body, and it must to write to a URI that has been read during the execution of the query; also, two calls on `put()` must not write to the same URI. However, it does use the XQuery semantics for resolving the relative URI.

Next