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 1c409a6b47820..9d950aca3d2e0 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; @@ -150,11 +151,24 @@ public void testRow() { public void testRowWithFilter() { long value = randomLongBetween(0, Long.MAX_VALUE); - try (EsqlQueryResponse response = run(syncEsqlQueryRequest().query("row " + value).filter(new BoolQueryBuilder().boost(1.0f)))) { + try (EsqlQueryResponse response = run(syncEsqlQueryRequest().query("ROW " + value).filter(randomQueryFilter()))) { assertEquals(List.of(List.of(value)), getValuesList(response)); } } + public void testInvalidRowWithFilter() { + long value = randomLongBetween(0, Long.MAX_VALUE); + expectThrows( + VerificationException.class, + containsString("Unknown column [x]"), + () -> run(syncEsqlQueryRequest().query("ROW " + value + " | EVAL x==NULL").filter(randomQueryFilter())) + ); + } + + 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 25be7292ad11c..1542a639204e5 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 @@ -213,6 +213,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.getRunningClusterAliases().collect(toSet()); 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 a4bfa329d8ac5..2b328d5bda5e0 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 @@ -742,9 +742,7 @@ private void analyzeWithRetry( 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); } LogicalPlan plan = analyzedPlan(parsed, result, executionInfo); LOGGER.debug("Analyzed plan ({}):\n{}", description, plan);