exist
                                
                                 exist copied to clipboard
                                
                                    exist copied to clipboard
                            
                            
                            
                        [BUG] XQuery bug on selecting nodes with last()
Describe the bug
Given XML document:
<A1 id="1">
  <B1 id="2"></B1>
</A1>
(No index defined)
and XPath query:
//*[last() <= 1]
Exist db returns empty result set
Expected behavior
Should return
<A1 id="1">
   <B1 id="2"/>
</A1>
<B1 id="2"/>
as BaseX, Saxon and Oracle
To Reproduce
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 {
    <A><B></B></A>
};
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:assertEquals("2")
function t:test-db() {
    count(
        doc("/db/test/test.xml")//*[last() <= 1]
    )
};
- Go to Java admin client
- Add XML document to collection
- Use find command to execute XPath Query
- See error
Context (please always complete the following information)
- Build: latest development version built from source, commit b700a92
- Java: 17
- OS: [Windows]
Additional context
- How is eXist-db installed? Jar installer
- Any custom changes in e.g. conf.xml? No
I'm not very sure whether this is considered to be a bug or not, and might not be a common expression? Therefore it might not be of great importance or require a fix. Thanks!
I can reproduce these results on 6.2.0.
A bug is a bug! Thank you for your reports!
My hunch is that this report is a variation of the earlier ones, and that solving them will solve this.
It is definitely a valid predicate. I am just not sure what it actually does :)
edit: Maybe it selects all elements, if there are less than 2 selected in the current XPath step.
in saxon <A><B></B></A>//*[last() <= 1] returns <B/>
The results in Saxon are ... mixed https://xqueryfiddle.liberty-development.net/bdxZ98
Thank you very much!
Christian Grün was so kind to explain to me what //*[somePredicate] actually means.
//*[last()]is a shortcut for/descendant-or-self::node()/child::*[last()]. It will give you the last child of each node of a document.
This can only mean that eXistdb is currently not rewriting the shortcut //* to the correct long form.