Skip to content

Commit bdac80c

Browse files
committed
[bugfix] Fix issues with document-node lookups on various axis.
Appears to have been caused by over zealous optimisations. The fixes should not impact general performance at all. Closes #4546
1 parent dd5eb44 commit bdac80c

File tree

2 files changed

+76
-4
lines changed

2 files changed

+76
-4
lines changed

exist-core/src/main/java/org/exist/xquery/LocationStep.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,8 @@ private boolean needsComputation() {
467467
if (nodeTestType == null) {
468468
nodeTestType = test.getType();
469469
}
470-
if (nodeTestType != Type.NODE
470+
if (nodeTestType != Type.DOCUMENT
471+
&& nodeTestType != Type.NODE
471472
&& nodeTestType != Type.ELEMENT
472473
&& nodeTestType != Type.PROCESSING_INSTRUCTION) {
473474
if (context.getProfiler().isEnabled()) {
@@ -1054,10 +1055,9 @@ protected Sequence getAncestors(final XQueryContext context, final Sequence cont
10541055

10551056
NodeId parentID = current.getNodeId().getParentId();
10561057
while (parentID != null) {
1057-
ancestor = new NodeProxy(this, current.getOwnerDocument(), parentID, Node.ELEMENT_NODE);
1058+
ancestor = new NodeProxy(this, current.getOwnerDocument(), parentID, parentID == NodeId.DOCUMENT_NODE ? Node.DOCUMENT_NODE : Node.ELEMENT_NODE);
10581059
// Filter out the temporary nodes wrapper element
1059-
if (parentID != NodeId.DOCUMENT_NODE
1060-
&& !(parentID.getTreeLevel() == 1 && current.getOwnerDocument().getCollection().isTempCollection())) {
1060+
if (!(parentID.getTreeLevel() == 1 && current.getOwnerDocument().getCollection().isTempCollection())) {
10611061
if (test.matches(ancestor)) {
10621062
final NodeProxy t = result.get(ancestor);
10631063
if (t == null) {

exist-core/src/test/xquery/document-nodes.xq

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,75 @@ declare
115115
function dn:memtree-document-node-element-wrong-name() {
116116
document { element template {} } instance of document-node(element(wrong))
117117
};
118+
119+
declare
120+
%test:assertEmpty
121+
function dn:persistent-document-node-from-collection() {
122+
collection($dn:TEST_COLLECTION)[1]/document-node()
123+
};
124+
125+
declare
126+
%test:assertExists
127+
function dn:persistent-document-node-from-collection-via-doc() {
128+
collection($dn:TEST_COLLECTION)[1]/doc(document-uri(.))
129+
};
130+
131+
declare
132+
%test:assertExists
133+
function dn:persistent-document-node-from-collection-via-self-axis() {
134+
collection($dn:TEST_COLLECTION)[1]/self::document-node()
135+
};
136+
137+
declare
138+
%test:assertExists
139+
function dn:persistent-document-node-from-collection-via-ancestor-of-self-axis() {
140+
collection($dn:TEST_COLLECTION)[1]/ancestor-or-self::document-node()
141+
};
142+
143+
declare
144+
%test:assertExists
145+
function dn:persistent-document-node-from-collection-via-parent-axis-node() {
146+
(collection($dn:TEST_COLLECTION)/template)[1]/parent::node()
147+
};
148+
149+
declare
150+
%test:assertEmpty
151+
function dn:persistent-document-node-from-collection-via-parent-axis-wildcard() {
152+
(collection($dn:TEST_COLLECTION)/template)[1]/parent::*
153+
};
154+
155+
declare
156+
%test:assertExists
157+
function dn:persistent-document-node-from-collection-via-parent-axis-document-node() {
158+
(collection($dn:TEST_COLLECTION)/template)[1]/parent::document-node()
159+
};
160+
161+
declare
162+
%test:assertExists
163+
function dn:persistent-document-node-from-collection-via-parent-axis-document-element() {
164+
(collection($dn:TEST_COLLECTION)/template)[1]/parent::document-node(element(template))
165+
};
166+
167+
declare
168+
%test:assertExists
169+
function dn:persistent-document-node-from-collection-via-ancestor-axis-document-node() {
170+
(collection($dn:TEST_COLLECTION)/template)[1]/ancestor::document-node()
171+
};
172+
173+
declare
174+
%test:assertExists
175+
function dn:persistent-document-node-from-collection-via-ancestor-axis-document-element() {
176+
(collection($dn:TEST_COLLECTION)/template)[1]/ancestor::document-node(element(template))
177+
};
178+
179+
declare
180+
%test:assertExists
181+
function dn:persistent-document-node-from-collection-via-ancestor-or-self-axis-document-node() {
182+
(collection($dn:TEST_COLLECTION)/template)[1]/ancestor-or-self::document-node()
183+
};
184+
185+
declare
186+
%test:assertExists
187+
function dn:persistent-document-node-from-collection-via-ancestor-or-self-axis-document-element() {
188+
(collection($dn:TEST_COLLECTION)/template)[1]/ancestor-or-self::document-node(element(template))
189+
};

0 commit comments

Comments
 (0)