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..8ed2f1d9e0 100644 --- a/exist-core/src/main/java/org/exist/xquery/ContextItemDeclaration.java +++ b/exist-core/src/main/java/org/exist/xquery/ContextItemDeclaration.java @@ -52,6 +52,10 @@ public void analyze(final AnalyzeContextInfo contextInfo) throws XPathException if (value.isPresent()) { value.get().analyze(contextInfo); + if (!value.get().getCardinality().atMostOne()) { + throw new XPathException(this, ErrorCodes.XPTY0004, "The context item must be exactly one item"); + } + } } @@ -77,6 +81,14 @@ public Sequence eval(final Sequence contextSequence, final Item contextItem) thr } } else { return value.get().eval(null, null); + +// else { +// 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; +// } } } 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 */