Skip to content

StringIndexOutOfBoundsException in ESQL COMPLETION command when optional parameters are omitted #138361

@afoucret

Description

@afoucret

Summary

A StringIndexOutOfBoundsException occurs when parsing ES|QL COMPLETION commands with omitted optional parameters (WITH clause).

Error Details

The error happens when attempting to extract source text from an empty CommandNamedParametersContext that has invalid token indices.

java.lang.StringIndexOutOfBoundsException: Range [174, 174 + -1) out of bounds for length 198
	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.outOfBoundsCheckFromIndexSize(Preconditions.java:118)
	at java.base/jdk.internal.util.Preconditions.checkFromIndexSize(Preconditions.java:397)
	at java.base/java.lang.String.checkBoundsOffCount(String.java:4925)
	at java.base/java.lang.String.<init>(String.java:546)
	at org.antlr.v4.runtime.CodePointCharStream$CodePoint8BitCharStream.getText(CodePointCharStream.java:160)
	at org.elasticsearch.xpack.esql.parser.ParserUtils.source(ParserUtils.java:131)
	at org.elasticsearch.xpack.esql.parser.ParserUtils.source(ParserUtils.java:103)
	at org.elasticsearch.xpack.esql.parser.LogicalPlanBuilder.applyCompletionOptions(LogicalPlanBuilder.java:1166)
	at org.elasticsearch.xpack.esql.parser.LogicalPlanBuilder.lambda$visitCompletionCommand$39(LogicalPlanBuilder.java:1155)
	at org.elasticsearch.xpack.esql.parser.LogicalPlanBuilder.visitCompositeQuery(LogicalPlanBuilder.java:200)
	at org.elasticsearch.xpack.esql.parser.LogicalPlanBuilder.visitCompositeQuery(LogicalPlanBuilder.java:114)
	at org.elasticsearch.xpack.esql.parser.EsqlBaseParser$CompositeQueryContext.accept(EsqlBaseParser.java:379)
	at org.elasticsearch.xpack.esql.parser.ParserUtils.typedParsing(ParserUtils.java:72)
	at org.elasticsearch.xpack.esql.parser.LogicalPlanBuilder.plan(LogicalPlanBuilder.java:135)
	at org.elasticsearch.xpack.esql.parser.LogicalPlanBuilder.visitCompositeQuery(LogicalPlanBuilder.java:197)
	at org.elasticsearch.xpack.esql.parser.LogicalPlanBuilder.visitCompositeQuery(LogicalPlanBuilder.java:114)
	at org.elasticsearch.xpack.esql.parser.EsqlBaseParser$CompositeQueryContext.accept(EsqlBaseParser.java:379)
	at org.elasticsearch.xpack.esql.parser.ParserUtils.typedParsing(ParserUtils.java:72)
	at org.elasticsearch.xpack.esql.parser.LogicalPlanBuilder.plan(LogicalPlanBuilder.java:135)
	at org.elasticsearch.xpack.esql.parser.LogicalPlanBuilder.visitSingleStatement(LogicalPlanBuilder.java:168)
	at org.elasticsearch.xpack.esql.parser.LogicalPlanBuilder.visitStatements(LogicalPlanBuilder.java:158)
	at org.elasticsearch.xpack.esql.parser.LogicalPlanBuilder.visitStatements(LogicalPlanBuilder.java:114)
	at org.elasticsearch.xpack.esql.parser.EsqlBaseParser$StatementsContext.accept(EsqlBaseParser.java:250)
	at org.elasticsearch.xpack.esql.parser.ParserUtils.typedParsing(ParserUtils.java:72)
	at org.elasticsearch.xpack.esql.parser.LogicalPlanBuilder.statement(LogicalPlanBuilder.java:130)
	at org.elasticsearch.xpack.esql.parser.EsqlParser.invokeParser(EsqlParser.java:172)
	at org.elasticsearch.xpack.esql.parser.EsqlParser.createQuery(EsqlParser.java:132)
	at org.elasticsearch.xpack.esql.session.EsqlSession.parse(EsqlSession.java:454)
	at org.elasticsearch.xpack.esql.session.EsqlSession.execute(EsqlSession.java:189)
	at org.elasticsearch.xpack.esql.execution.PlanExecutor.lambda$esql$2(PlanExecutor.java:102)
	at org.elasticsearch.server@9.3.0/org.elasticsearch.action.ActionListener.run(ActionListener.java:465)
	at org.elasticsearch.xpack.esql.execution.PlanExecutor.esql(PlanExecutor.java:102)
	at org.elasticsearch.xpack.esql.plugin.TransportEsqlQueryAction.innerExecute(TransportEsqlQueryAction.java:257)
	at org.elasticsearch.xpack.esql.plugin.TransportEsqlQueryAction.doExecuteForked(TransportEsqlQueryAction.java:227)
	at org.elasticsearch.xpack.esql.plugin.TransportEsqlQueryAction.lambda$doExecute$5(TransportEsqlQueryAction.java:217)
	at org.elasticsearch.server@9.3.0/org.elasticsearch.action.ActionRunnable$4.doRun(ActionRunnable.java:101)
	at org.elasticsearch.server@9.3.0/org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:27)
	at org.elasticsearch.server@9.3.0/org.elasticsearch.common.util.concurrent.TimedRunnable.doRun(TimedRunnable.java:35)
	at org.elasticsearch.server@9.3.0/org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:1076)
	at org.elasticsearch.server@9.3.0/org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:27)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
	at java.base/java.lang.Thread.run(Thread.java:1474)

Metadata

Metadata

Assignees

Labels

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions