diff --git a/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/EsqlActionIT.java b/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/EsqlActionIT.java index 83fb37a29b5a9..8fb2352cc2247 100644 --- a/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/EsqlActionIT.java +++ b/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/EsqlActionIT.java @@ -39,6 +39,7 @@ import org.elasticsearch.index.mapper.DateFieldMapper; import org.elasticsearch.index.mapper.extras.MapperExtrasPlugin; import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.MatchAllQueryBuilder; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.RangeQueryBuilder; import org.elasticsearch.index.shard.IndexShard; @@ -151,13 +152,25 @@ public void testRow() { public void testRowWithFilter() { long value = randomLongBetween(0, Long.MAX_VALUE); EsqlQueryRequest request = syncEsqlQueryRequest(); - request.query("row " + value); - request.filter(new BoolQueryBuilder().boost(1.0f)); + request.query("ROW " + value); + request.filter(randomQueryFilter()); try (EsqlQueryResponse response = run(request)) { assertEquals(List.of(List.of(value)), getValuesList(response)); } } + public void testInvalidRowWithFilter() { + long value = randomLongBetween(0, Long.MAX_VALUE); + EsqlQueryRequest request = syncEsqlQueryRequest(); + request.query("ROW " + value + " | EVAL x==NULL"); + request.filter(randomQueryFilter()); + expectThrows(VerificationException.class, containsString("Unknown column [x]"), () -> run(request)); + } + + private static QueryBuilder randomQueryFilter() { + return randomFrom(new MatchAllQueryBuilder(), new BoolQueryBuilder().boost(1.0f)); + } + public void testFromStatsGroupingAvgWithSort() { testFromStatsGroupingAvgImpl("from test | stats avg(count) by data | sort data | limit 2", "data", "avg(count)"); } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlCCSUtils.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlCCSUtils.java index 7ea218ed6d61c..422a5c06e4e75 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlCCSUtils.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlCCSUtils.java @@ -201,6 +201,9 @@ static void updateExecutionInfoWithClustersWithNoMatchingIndices( IndexResolution indexResolution, boolean usedFilter ) { + if (executionInfo.clusterInfo.isEmpty()) { + return; + } // Get the clusters which are still running, and we will check whether they have any matching indices. // NOTE: we assume that updateExecutionInfoWithUnavailableClusters() was already run and took care of unavailable clusters. final Set clustersWithNoMatchingIndices = executionInfo.getClusterStates(Cluster.Status.RUNNING) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlSession.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlSession.java index f30ecc185ece5..76d3b9c3cdc73 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlSession.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlSession.java @@ -568,9 +568,7 @@ private static void analyzeAndMaybeRetry( if (result.indices.isValid() || requestFilter != null) { // We won't run this check with no filter and no valid indices since this may lead to false positive - missing index report // when the resolution result is not valid for a different reason. - if (executionInfo.clusterInfo.isEmpty() == false) { - EsqlCCSUtils.updateExecutionInfoWithClustersWithNoMatchingIndices(executionInfo, result.indices, requestFilter != null); - } + EsqlCCSUtils.updateExecutionInfoWithClustersWithNoMatchingIndices(executionInfo, result.indices, requestFilter != null); } plan = analyzeAction.apply(result); } catch (Exception e) {