Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ES|QL: ClassCastException - Literal cannot be cast to NamedExpression during local planning #109974

Closed
luigidellaquila opened this issue Jun 20, 2024 · 1 comment · Fixed by #110096
Assignees
Labels
:Analytics/ES|QL AKA ESQL >bug Team:Analytics Meta label for analytical engine team (ESQL/Aggs/Geo)

Comments

@luigidellaquila
Copy link
Contributor

luigidellaquila commented Jun 20, 2024

The problem happened on a very wide index pattern, where most likely some nodes are executing an MV_EXPAN on an attribute that does not exist on the local shards.

The local planner is running ReplaceMissingFieldWithNull optimization and probably replacing the target of MV_EXPAND with a Literal, but MV_EXPAND defines it as NamedExpression.

Happens with the following queries:

FROM logs*
| MV_EXPAND tags
| sort tags
| LIMIT 1
FROM logs*
| MV_EXPAND tags
| WHERE tags == \"auditd-log\"
| LIMIT 1

For this second query, in my specific case it fails with some specific limits (eg. LIMIT 10) but not with higher limits (eg. LIMIT 1000)

java.lang.ClassCastException: class org.elasticsearch.xpack.esql.core.expression.Literal cannot be cast to class org.elasticsearch.xpack.esql.core.expression.NamedExpression (org.elasticsearch.xpack.esql.core.expression.Literal and org.elasticsearch.xpack.esql.core.expression.NamedExpression are in unnamed module of loader java.net.FactoryURLClassLoader @3ebc6d8b)
	at org.elasticsearch.xpack.esql.core.tree.NodeInfo$4.innerTransform(NodeInfo.java:146)
	at org.elasticsearch.xpack.esql.core.tree.NodeInfo.transform(NodeInfo.java:60)
	at org.elasticsearch.xpack.esql.core.tree.Node.transformNodeProps(Node.java:260)
	at org.elasticsearch.xpack.esql.core.tree.Node.transformPropertiesOnly(Node.java:240)
	at org.elasticsearch.xpack.esql.core.plan.QueryPlan.transformExpressionsOnlyUp(QueryPlan.java:91)
	at org.elasticsearch.xpack.esql.optimizer.LocalLogicalPlanOptimizer$ReplaceMissingFieldWithNull.missingToNull(LocalLogicalPlanOptimizer.java:168)
	at org.elasticsearch.xpack.esql.optimizer.LocalLogicalPlanOptimizer$ReplaceMissingFieldWithNull.lambda$apply$0(LocalLogicalPlanOptimizer.java:123)
	at org.elasticsearch.xpack.esql.core.tree.Node.transformUp(Node.java:192)
	at org.elasticsearch.xpack.esql.core.tree.Node.lambda$transformUp$10(Node.java:190)
	at org.elasticsearch.xpack.esql.core.tree.Node.transformChildren(Node.java:211)
	at org.elasticsearch.xpack.esql.core.tree.Node.transformUp(Node.java:190)
	at org.elasticsearch.xpack.esql.core.tree.Node.lambda$transformUp$10(Node.java:190)
	at org.elasticsearch.xpack.esql.core.tree.Node.transformChildren(Node.java:211)
	at org.elasticsearch.xpack.esql.core.tree.Node.transformUp(Node.java:190)
	at org.elasticsearch.xpack.esql.core.tree.Node.lambda$transformUp$10(Node.java:190)
	at org.elasticsearch.xpack.esql.core.tree.Node.transformChildren(Node.java:211)
	at org.elasticsearch.xpack.esql.core.tree.Node.transformUp(Node.java:190)
	at org.elasticsearch.xpack.esql.optimizer.LocalLogicalPlanOptimizer$ReplaceMissingFieldWithNull.apply(LocalLogicalPlanOptimizer.java:123)
	at org.elasticsearch.xpack.esql.optimizer.LocalLogicalPlanOptimizer$ReplaceMissingFieldWithNull.apply(LocalLogicalPlanOptimizer.java:119)
	at org.elasticsearch.xpack.esql.core.rule.ParameterizedRuleExecutor.lambda$transform$0(ParameterizedRuleExecutor.java:29)
	at org.elasticsearch.xpack.esql.core.rule.RuleExecutor$Transformation.<init>(RuleExecutor.java:88)
	at org.elasticsearch.xpack.esql.core.rule.RuleExecutor.executeWithInfo(RuleExecutor.java:167)
	at org.elasticsearch.xpack.esql.core.rule.RuleExecutor.execute(RuleExecutor.java:136)
	at org.elasticsearch.xpack.esql.optimizer.LocalLogicalPlanOptimizer.localOptimize(LocalLogicalPlanOptimizer.java:98)
	at org.elasticsearch.xpack.esql.planner.PlannerUtils.lambda$localPlan$7(PlannerUtils.java:157)
	at org.elasticsearch.xpack.esql.core.tree.Node.lambda$transformUp$11(Node.java:198)
	at org.elasticsearch.xpack.esql.core.tree.Node.transformUp(Node.java:192)
	at org.elasticsearch.xpack.esql.core.tree.Node.lambda$transformUp$10(Node.java:190)
	at org.elasticsearch.xpack.esql.core.tree.Node.transformChildren(Node.java:211)
	at org.elasticsearch.xpack.esql.core.tree.Node.transformUp(Node.java:190)
	at org.elasticsearch.xpack.esql.core.tree.Node.transformUp(Node.java:198)
	at org.elasticsearch.xpack.esql.planner.PlannerUtils.localPlan(PlannerUtils.java:155)
	at org.elasticsearch.xpack.esql.planner.PlannerUtils.localPlan(PlannerUtils.java:144)
	at org.elasticsearch.xpack.esql.planner.PlannerUtils.localPlan(PlannerUtils.java:137)
	at org.elasticsearch.xpack.esql.plugin.ComputeService.runCompute(ComputeService.java:428)
	at org.elasticsearch.xpack.esql.plugin.ComputeService$DataNodeRequestExecutor.lambda$runBatch$2(ComputeService.java:653)
	at org.elasticsearch.server@8.15.0/org.elasticsearch.action.ActionListener$2.onResponse(ActionListener.java:248)
	at org.elasticsearch.server@8.15.0/org.elasticsearch.action.ActionRunnable$2.accept(ActionRunnable.java:57)
	at org.elasticsearch.server@8.15.0/org.elasticsearch.action.ActionRunnable$2.accept(ActionRunnable.java:54)
	at org.elasticsearch.server@8.15.0/org.elasticsearch.action.ActionRunnable$4.doRun(ActionRunnable.java:100)
	at org.elasticsearch.server@8.15.0/org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:26)
	at org.elasticsearch.xpack.esql.plugin.ComputeService.lambda$acquireSearchContexts$23(ComputeService.java:511)
	at org.elasticsearch.base@8.15.0/org.elasticsearch.core.AbstractRefCounted$1.closeInternal(AbstractRefCounted.java:118)
	at org.elasticsearch.base@8.15.0/org.elasticsearch.core.AbstractRefCounted.decRef(AbstractRefCounted.java:70)
	at org.elasticsearch.server@8.15.0/org.elasticsearch.action.support.RefCountingRunnable.close(RefCountingRunnable.java:112)
	at org.elasticsearch.xpack.esql.plugin.ComputeService.acquireSearchContexts(ComputeService.java:524)
	at org.elasticsearch.xpack.esql.plugin.ComputeService$DataNodeRequestExecutor.runBatch(ComputeService.java:650)
	at org.elasticsearch.xpack.esql.plugin.ComputeService$DataNodeRequestExecutor.onBatchCompleted(ComputeService.java:667)
	at org.elasticsearch.xpack.esql.plugin.ComputeService$DataNodeRequestExecutor.lambda$runBatch$1(ComputeService.java:657)
	at org.elasticsearch.server@8.15.0/org.elasticsearch.action.ActionListener$2.onResponse(ActionListener.java:248)
	at org.elasticsearch.server@8.15.0/org.elasticsearch.action.ActionListenerImplementations$RunBeforeActionListener.onResponse(ActionListenerImplementations.java:307)
	at org.elasticsearch.server@8.15.0/org.elasticsearch.action.ActionListenerImplementations$MappedActionListener.onResponse(ActionListenerImplementations.java:95)
	at org.elasticsearch.server@8.15.0/org.elasticsearch.action.ActionListenerImplementations$RunAfterActionListener.onResponse(ActionListenerImplementations.java:269)
	at org.elasticsearch.compute.operator.DriverRunner$1.done(DriverRunner.java:84)
	at org.elasticsearch.compute.operator.DriverRunner$1.onResponse(DriverRunner.java:46)
	at org.elasticsearch.compute.operator.DriverRunner$1.onResponse(DriverRunner.java:43)
	at org.elasticsearch.server@8.15.0/org.elasticsearch.action.ActionListener$2.onResponse(ActionListener.java:248)
	at org.elasticsearch.server@8.15.0/org.elasticsearch.transport.TransportResponseHandler$1.handleResponse(TransportResponseHandler.java:53)
	at org.elasticsearch.server@8.15.0/org.elasticsearch.transport.TransportResponseHandler$Empty.handleResponse(TransportResponseHandler.java:43)
	at org.elasticsearch.server@8.15.0/org.elasticsearch.transport.TransportResponseHandler$Empty.handleResponse(TransportResponseHandler.java:35)
	at org.elasticsearch.server@8.15.0/org.elasticsearch.transport.TransportService$UnregisterChildTransportResponseHandler.handleResponse(TransportService.java:1757)
	at org.elasticsearch.server@8.15.0/org.elasticsearch.transport.TransportService$ContextRestoreResponseHandler.handleResponse(TransportService.java:1480)
	at org.elasticsearch.server@8.15.0/org.elasticsearch.transport.TransportService$DirectResponseChannel.processResponse(TransportService.java:1577)
	at org.elasticsearch.server@8.15.0/org.elasticsearch.transport.TransportService$DirectResponseChannel$1.doRun(TransportService.java:1557)
	at org.elasticsearch.server@8.15.0/org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:26)
	at org.elasticsearch.server@8.15.0/org.elasticsearch.common.util.concurrent.TimedRunnable.doRun(TimedRunnable.java:33)
	at org.elasticsearch.server@8.15.0/org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:984)
	at org.elasticsearch.server@8.15.0/org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:26)
	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:1570)
@elasticsearchmachine
Copy link
Collaborator

Pinging @elastic/es-analytical-engine (Team:Analytics)

@elasticsearchmachine elasticsearchmachine added the Team:Analytics Meta label for analytical engine team (ESQL/Aggs/Geo) label Jun 20, 2024
@luigidellaquila luigidellaquila self-assigned this Jun 24, 2024
elasticsearchmachine pushed a commit that referenced this issue Jul 3, 2024
…ll (#110373)

Fix ReplaceMissingFieldWithNull by explicitly listing the commands that
can be optimized replacing missing FieldAttributed with NULL Literals.

Also adding a unit test that demonstrates possible scenarios where
introducing a new command can lead to `ClassCastException` with
`ReplaceMissingFieldWithNull` local optimization rule and an integration
test that covers #109974

Fixes #110150
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
:Analytics/ES|QL AKA ESQL >bug Team:Analytics Meta label for analytical engine team (ESQL/Aggs/Geo)
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants