diff --git a/exist-core/src/main/java/org/exist/xquery/ContextItemDeclaration.java b/exist-core/src/main/java/org/exist/xquery/ContextItemDeclaration.java index 475c892ba9..b3e26fede6 100644 --- a/exist-core/src/main/java/org/exist/xquery/ContextItemDeclaration.java +++ b/exist-core/src/main/java/org/exist/xquery/ContextItemDeclaration.java @@ -76,10 +76,16 @@ public Sequence eval(final Sequence contextSequence, final Item contextItem) thr return null; } } else { - return value.get().eval(null, null); + final Sequence result = value.get().eval(null, null); + if (result.isEmpty() || result.hasMany()) { + throw new XPathException(this, ErrorCodes.XPTY0004, "The context item must be exactly one item"); + } else { + return result; + } } } + @Override public int returnsType() { return itemType.map(SequenceType::getPrimaryType) diff --git a/exist-core/src/test/java/org/exist/xquery/XQueryDeclareContextItemTest.java b/exist-core/src/test/java/org/exist/xquery/XQueryDeclareContextItemTest.java index 00d1d3d4b9..12b96876d6 100644 --- a/exist-core/src/test/java/org/exist/xquery/XQueryDeclareContextItemTest.java +++ b/exist-core/src/test/java/org/exist/xquery/XQueryDeclareContextItemTest.java @@ -79,8 +79,7 @@ import java.util.Optional; import java.util.Properties; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.*; /** * Tests for XQuery 3.0's declare context item @@ -144,6 +143,22 @@ public void declareContextItem() throws EXistException, PermissionDeniedExceptio } } + @Test + public void declareContextItemMoreThanOneItem() throws EXistException, PermissionDeniedException, XPathException, IOException { + final String query = + "xquery version \"3.0\";\n" + + "declare context item := (1,2); \n" + + "."; + + final BrokerPool pool = existEmbeddedServer.getBrokerPool(); + try (final DBBroker broker = pool.getBroker(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + fail("Expected XQuery error XPTY0004"); + } catch (final XPathException e){ + assertEquals(ErrorCodes.XPTY0004, e.getErrorCode()); + } + } + /** * See issue https://github.com/eXist-db/exist/issues/2156 */