diff --git a/exist-core/src/main/java/org/exist/xquery/GeneralComparison.java b/exist-core/src/main/java/org/exist/xquery/GeneralComparison.java
index d277e81f75..30037df7e5 100644
--- a/exist-core/src/main/java/org/exist/xquery/GeneralComparison.java
+++ b/exist-core/src/main/java/org/exist/xquery/GeneralComparison.java
@@ -648,6 +648,9 @@ protected Sequence nodeSetCompare( NodeSet nodes, Sequence contextSequence ) thr
}
}
}
+ if (result.isEmpty()) {
+ return BooleanValue.FALSE;
+ }
}
if( context.getProfiler().traceFunctions() ) {
diff --git a/exist-core/src/main/java/org/exist/xquery/Predicate.java b/exist-core/src/main/java/org/exist/xquery/Predicate.java
index 986de11bb8..efe44f256b 100644
--- a/exist-core/src/main/java/org/exist/xquery/Predicate.java
+++ b/exist-core/src/main/java/org/exist/xquery/Predicate.java
@@ -36,6 +36,7 @@
import org.exist.xquery.value.SequenceIterator;
import org.exist.xquery.value.Type;
import org.exist.xquery.value.ValueSequence;
+import org.exist.xquery.value.BooleanValue;
import javax.annotation.Nullable;
import java.util.Set;
@@ -377,7 +378,14 @@ private Sequence selectByNodeSet(final Sequence contextSequence) throws XPathExc
final NodeSet contextSet = contextSequence.toNodeSet();
final boolean contextIsVirtual = contextSet instanceof VirtualNodeSet;
contextSet.setTrackMatches(false);
- final NodeSet nodes = super.eval(contextSet, null).toNodeSet();
+ final Sequence res = super.eval(contextSet, null);
+ if(!(res instanceof NodeSet)) {
+ if(res == BooleanValue.FALSE)
+ return NodeSet.EMPTY_SET;
+ return res;
+ }
+ final NodeSet nodes = res.toNodeSet();
+
/*
* if the predicate expression returns results from the cache we can
* also return the cached result.
diff --git a/exist-core/src/test/xquery/emptySeq.xq b/exist-core/src/test/xquery/emptySeq.xq
new file mode 100644
index 0000000000..a3be9ea756
--- /dev/null
+++ b/exist-core/src/test/xquery/emptySeq.xq
@@ -0,0 +1,38 @@
+xquery version "3.1";
+
+module namespace t="http://exist-db.org/xquery/test";
+
+declare namespace test="http://exist-db.org/xquery/xqsuite";
+
+declare variable $t:XML := document {
+
+};
+
+declare
+ %test:setUp
+function t:setup() {
+ xmldb:create-collection("/db", "test"),
+ xmldb:store("/db/test", "test.xml", $t:XML)
+};
+
+declare
+ %test:tearDown
+function t:tearDown() {
+ xmldb:remove("/db/test")
+};
+
+declare
+ %test:assertTrue
+function t:test-db() {
+ exists(
+ doc("/db/test/test.xml")//F[boolean(count(@id >= 2))]
+ )
+};
+
+declare
+ %test:assertTrue
+function t:test-mem() {
+ exists(
+ $t:XML//F[boolean(count(@id >= 2))]
+ )
+};
\ No newline at end of file
diff --git a/exist-core/src/test/xquery/startWithComp.xq b/exist-core/src/test/xquery/startWithComp.xq
new file mode 100644
index 0000000000..78c2ada88a
--- /dev/null
+++ b/exist-core/src/test/xquery/startWithComp.xq
@@ -0,0 +1,32 @@
+xquery version "3.1";
+
+module namespace t="http://exist-db.org/xquery/test";
+
+declare namespace test="http://exist-db.org/xquery/xqsuite";
+
+declare variable $t:XML := document {
+
+ true
+
+};
+
+declare
+ %test:setUp
+function t:setup() {
+ let $testCol := xmldb:create-collection("/db", "test")
+ return
+ xmldb:store("/db/test", "test.xml", $t:XML)
+};
+
+declare
+ %test:tearDown
+function t:tearDown() {
+ xmldb:remove("/db/test")
+};
+
+declare
+ %test:assertTrue
+function t:test() {
+ doc("/db/test/test.xml")//*[starts-with(@a2, "1") = false()]
+ => exists()
+};
\ No newline at end of file