Skip to content

[ES|QL] Missing backport of "FROM *-*" bug fix #126819

@nflexfo

Description

@nflexfo

Elasticsearch Version

8.17.4

Installed Plugins

No response

Java Version

bundled

OS Version

Linux

Problem Description

In ES|QL, the pattern FROM *-* leads to the following exception:

java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

Looking at IdentifierBuilder::validateIndexPattern(), the index pattern goes from:

  1. "*-*"
  2. "-" after index.replace(WILDCARD, "").strip();
  3. "" (empty) after removeExclusion(index); (using index.substring(1);)
  4. Call to MetadataCreateIndexService.validateIndexOrAliasName(index, InvalidIndexNameException::new);
  5. Throws the exception when calling index.charAt(0) == '_' , since the string is empty

Note that this issue seems to be already addressed by commit d6133235a339, pull request #119960.

Altough, the pull request #120060 seems to backport it to 8.x branch, it is not present in 8.17.4. Is it an overlook or will it be present in the next patch version?

Thanks.

Steps to Reproduce

  1. Switch to ES|QL mode
  2. Request FROM *-*

Logs (if relevant)


[2025-04-15T06:53:09,528][WARN ][o.e.x.e.a.EsqlResponseListener] [b7bd49a58476] Request failed with status [INTERNAL_SERVER_ERROR]: java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
	at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:55)
	at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:52)
	at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:213)
	at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:210)
	at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:98)
	at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:106)
	at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:302)
	at java.base/java.lang.String.checkIndex(String.java:4930)
	at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:46)
	at java.base/java.lang.String.charAt(String.java:1629)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.cluster.metadata.MetadataCreateIndexService.validateIndexOrAliasName(MetadataCreateIndexService.java:237)
	at org.elasticsearch.xpack.esql.parser.IdentifierBuilder.validateIndexPattern(IdentifierBuilder.java:104)
	at org.elasticsearch.xpack.esql.parser.IdentifierBuilder.lambda$visitIndexPattern$0(IdentifierBuilder.java:70)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1597)
	at org.elasticsearch.xpack.esql.parser.IdentifierBuilder.visitIndexPattern(IdentifierBuilder.java:63)
	at org.elasticsearch.xpack.esql.parser.ExpressionBuilder.visitIndexPattern(ExpressionBuilder.java:92)
	at org.elasticsearch.xpack.esql.parser.LogicalPlanBuilder.visitFromCommand(LogicalPlanBuilder.java:259)
	at org.elasticsearch.xpack.esql.parser.LogicalPlanBuilder.visitFromCommand(LogicalPlanBuilder.java:87)
	at org.elasticsearch.xpack.esql.parser.EsqlBaseParser$FromCommandContext.accept(EsqlBaseParser.java:2192)
	at org.antlr.v4.runtime.tree.AbstractParseTreeVisitor.visitChildren(AbstractParseTreeVisitor.java:46)
	at org.elasticsearch.xpack.esql.parser.EsqlBaseParserBaseVisitor.visitSourceCommand(EsqlBaseParserBaseVisitor.java:50)
	at org.elasticsearch.xpack.esql.parser.EsqlBaseParser$SourceCommandContext.accept(EsqlBaseParser.java:400)
	at org.antlr.v4.runtime.tree.AbstractParseTreeVisitor.visitChildren(AbstractParseTreeVisitor.java:46)
	at org.elasticsearch.xpack.esql.parser.EsqlBaseParserBaseVisitor.visitSingleCommandQuery(EsqlBaseParserBaseVisitor.java:43)
	at org.elasticsearch.xpack.esql.parser.EsqlBaseParser$SingleCommandQueryContext.accept(EsqlBaseParser.java:302)
	at org.elasticsearch.xpack.esql.parser.ParserUtils.typedParsing(ParserUtils.java:68)
	at org.elasticsearch.xpack.esql.parser.LogicalPlanBuilder.plan(LogicalPlanBuilder.java:103)
	at org.elasticsearch.xpack.esql.parser.LogicalPlanBuilder.visitSingleStatement(LogicalPlanBuilder.java:128)
	at org.elasticsearch.xpack.esql.parser.LogicalPlanBuilder.visitSingleStatement(LogicalPlanBuilder.java:87)
	at org.elasticsearch.xpack.esql.parser.EsqlBaseParser$SingleStatementContext.accept(EsqlBaseParser.java:218)
	at org.elasticsearch.xpack.esql.parser.ParserUtils.typedParsing(ParserUtils.java:68)
	at org.elasticsearch.xpack.esql.parser.LogicalPlanBuilder.plan(LogicalPlanBuilder.java:103)
	at org.elasticsearch.xpack.esql.parser.EsqlParser.invokeParser(EsqlParser.java:92)
	at org.elasticsearch.xpack.esql.parser.EsqlParser.createStatement(EsqlParser.java:55)
	at org.elasticsearch.xpack.esql.session.EsqlSession.parse(EsqlSession.java:264)
	at org.elasticsearch.xpack.esql.session.EsqlSession.execute(EsqlSession.java:150)
	at org.elasticsearch.xpack.esql.execution.PlanExecutor.esql(PlanExecutor.java:80)
	at org.elasticsearch.xpack.esql.plugin.TransportEsqlQueryAction.innerExecute(TransportEsqlQueryAction.java:185)
	at org.elasticsearch.xpack.esql.plugin.TransportEsqlQueryAction.lambda$execute$1(TransportEsqlQueryAction.java:154)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.ActionListener.run(ActionListener.java:454)
	at org.elasticsearch.xpack.esql.plugin.TransportEsqlQueryAction.execute(TransportEsqlQueryAction.java:154)
	at org.elasticsearch.xpack.esql.plugin.TransportEsqlQueryAction.execute(TransportEsqlQueryAction.java:56)
	at org.elasticsearch.xpack.esql.core.async.AsyncTaskManagementService.asyncExecute(AsyncTaskManagementService.java:188)
	at org.elasticsearch.xpack.esql.plugin.TransportEsqlQueryAction.doExecuteForked(TransportEsqlQueryAction.java:140)
	at org.elasticsearch.xpack.esql.plugin.TransportEsqlQueryAction.lambda$doExecute$0(TransportEsqlQueryAction.java:132)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.action.ActionRunnable$4.doRun(ActionRunnable.java:101)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:27)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.common.util.concurrent.TimedRunnable.doRun(TimedRunnable.java:34)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:1023)
	at org.elasticsearch.server@8.17.4/org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:27)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
	at java.base/java.lang.Thread.run(Thread.java:1575)

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions