[YANGTOOLS-1387] XPath: XPath keyword not accepted as valid XPath expression Created: 16/Dec/21  Updated: 10/Jan/22  Resolved: 20/Dec/21

Status: Resolved
Project: yangtools
Component/s: xpath
Affects Version/s: 6.0.0, 7.0.0, 6.0.8, 7.0.9
Fix Version/s: 8.0.0, 6.0.9, 7.0.11

Type: Bug Priority: Highest
Reporter: Sangwook Ha Assignee: Robert Varga
Resolution: Done Votes: 0
Labels: regression
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Relates
relates to YANGTOOLS-1137 Enforce correct XPath arguments Resolved

 Description   

If data node is one of the XPath keywords (and, div, mod, or), then the data node name alone is not considered a valid XPath expression.

For example, the following data model is not accepted because and is not a valid XPath expression based on the Antlr specification used by Yangtools:

module xpath-test {
  yang-version 1.1;
  namespace "urn:opendaylight:must-test";
  prefix "mt";

  revision "2021-12-16";

  container foo {
    list bar {
      key "baz";
      must "and";
      leaf baz {
        type string;
      }
      list and {
        key "baz";
        leaf baz {
          type string;
        }
      }
    }
  }
}

And there is such a data model actually used by Cisco routers (Cisco-IOS-XR-um-router-pim-cfg.yang), and this is preventing Silicon or later version from mounting the devices.



 Comments   
Comment by Robert Varga [ 19/Dec/21 ]

Reproducer fails with:

org.antlr.v4.runtime.InputMismatchException
	at org.antlr.antlr4.runtime@4.9.3/org.antlr.v4.runtime.DefaultErrorStrategy.sync(DefaultErrorStrategy.java:270)
	at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.multiplicativeExpr(xpathParser.java:1302)
	at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.additiveExpr(xpathParser.java:1243)
	at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.relationalExpr(xpathParser.java:1176)
	at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.equalityExpr(xpathParser.java:1101)
	at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.andExpr(xpathParser.java:1050)
	at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.orExpr(xpathParser.java:999)
	at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.expr(xpathParser.java:616)
	at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.main(xpathParser.java:132)
	at org.opendaylight.yangtools.yang.xpath.impl@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.impl.AntlrXPathParser.parseExpr(AntlrXPathParser.java:265)
	at org.opendaylight.yangtools.yang.xpath.impl@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.impl.AntlrXPathParser$Unqualified.parseExpression(AntlrXPathParser.java:179)
	at org.opendaylight.yangtools.yang.xpath.impl@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.impl.AntlrXPathParser$Unqualified.parseExpression(AntlrXPathParser.java:167)
	at org.opendaylight.yangtools.yang.xpath.impl@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.impl.XPathParserTest.parseExpr(XPathParserTest.java:131)
	at org.opendaylight.yangtools.yang.xpath.impl@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.impl.XPathParserTest.testAndPredicated(XPathParserTest.java:126)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:365)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:273)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:238)
	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:159)
	at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:384)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:345)
	at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:126)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:418)
--------------- linked to ------------------
javax.xml.xpath.XPathExpressionException: mismatched input 'and' expecting {'processing-instruction', '$', NodeType, Number, AxisName, '/', '//', '(', '-', '.', '*', '..', '@', Literal, NCName}
	at org.opendaylight.yangtools.yang.xpath.impl@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.impl.Utils.wrapException(Utils.java:77)
	at org.opendaylight.yangtools.yang.xpath.impl@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.impl.CapturingErrorListener.syntaxError(CapturingErrorListener.java:26)
	at org.antlr.antlr4.runtime@4.9.3/org.antlr.v4.runtime.ProxyErrorListener.syntaxError(ProxyErrorListener.java:41)
	at org.antlr.antlr4.runtime@4.9.3/org.antlr.v4.runtime.Parser.notifyErrorListeners(Parser.java:544)
	at org.antlr.antlr4.runtime@4.9.3/org.antlr.v4.runtime.DefaultErrorStrategy.reportInputMismatch(DefaultErrorStrategy.java:327)
	at org.antlr.antlr4.runtime@4.9.3/org.antlr.v4.runtime.DefaultErrorStrategy.reportError(DefaultErrorStrategy.java:139)
	at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.multiplicativeExpr(xpathParser.java:1362)
	at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.additiveExpr(xpathParser.java:1243)
	at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.relationalExpr(xpathParser.java:1176)
	at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.equalityExpr(xpathParser.java:1101)
	at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.andExpr(xpathParser.java:1050)
	at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.orExpr(xpathParser.java:999)
	at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.expr(xpathParser.java:616)
	at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.main(xpathParser.java:132)
	at org.opendaylight.yangtools.yang.xpath.impl@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.impl.AntlrXPathParser.parseExpr(AntlrXPathParser.java:265)
	at org.opendaylight.yangtools.yang.xpath.impl@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.impl.AntlrXPathParser$Unqualified.parseExpression(AntlrXPathParser.java:179)
	at org.opendaylight.yangtools.yang.xpath.impl@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.impl.AntlrXPathParser$Unqualified.parseExpression(AntlrXPathParser.java:167)
	at org.opendaylight.yangtools.yang.xpath.impl@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.impl.XPathParserTest.parseExpr(XPathParserTest.java:131)
	at org.opendaylight.yangtools.yang.xpath.impl@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.impl.XPathParserTest.testAndPredicated(XPathParserTest.java:126)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:365)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:273)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:238)
	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:159)
	at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:384)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:345)
	at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:126)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:418)
	Suppressed: javax.xml.xpath.XPathExpressionException: mismatched input '<EOF>' expecting {'processing-instruction', '$', NodeType, Number, AxisName, '/', '//', '(', '-', '.', '*', '..', '@', Literal, NCName}
		at org.opendaylight.yangtools.yang.xpath.impl@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.impl.Utils.wrapException(Utils.java:77)
		at org.opendaylight.yangtools.yang.xpath.impl@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.impl.CapturingErrorListener.syntaxError(CapturingErrorListener.java:26)
		at org.antlr.antlr4.runtime@4.9.3/org.antlr.v4.runtime.ProxyErrorListener.syntaxError(ProxyErrorListener.java:41)
		at org.antlr.antlr4.runtime@4.9.3/org.antlr.v4.runtime.Parser.notifyErrorListeners(Parser.java:544)
		at org.antlr.antlr4.runtime@4.9.3/org.antlr.v4.runtime.DefaultErrorStrategy.reportInputMismatch(DefaultErrorStrategy.java:327)
		at org.antlr.antlr4.runtime@4.9.3/org.antlr.v4.runtime.DefaultErrorStrategy.reportError(DefaultErrorStrategy.java:139)
		at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.multiplicativeExpr(xpathParser.java:1362)
		at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.additiveExpr(xpathParser.java:1243)
		at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.relationalExpr(xpathParser.java:1176)
		at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.equalityExpr(xpathParser.java:1101)
		at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.andExpr(xpathParser.java:1060)
		... 37 more
	Caused by: org.antlr.v4.runtime.InputMismatchException
		at org.antlr.antlr4.runtime@4.9.3/org.antlr.v4.runtime.DefaultErrorStrategy.sync(DefaultErrorStrategy.java:270)
		at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.multiplicativeExpr(xpathParser.java:1302)
		... 41 more
Caused by: org.antlr.v4.runtime.InputMismatchException
	at org.antlr.antlr4.runtime@4.9.3/org.antlr.v4.runtime.DefaultErrorStrategy.sync(DefaultErrorStrategy.java:270)
	at org.opendaylight.yangtools.yang.xpath.antlr@8.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.multiplicativeExpr(xpathParser.java:1302)
	... 41 more

So 'and' is not being matched as a NCName. I think this boils down to the implicit lexer token taking over.

Generated at Wed Feb 07 20:56:00 UTC 2024 using Jira 8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d.