diff --git a/docs/changelog/122762.yaml b/docs/changelog/122762.yaml new file mode 100644 index 0000000000000..d5320e7604f80 --- /dev/null +++ b/docs/changelog/122762.yaml @@ -0,0 +1,6 @@ +pr: 122762 +summary: "ESQL: Remove estimated row size assertion" +area: ES|QL +type: bug +issues: + - 121535 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 de9eb166688f9..8268161ba6922 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 @@ -587,6 +587,28 @@ public void testFilterWithNullAndEval() { } } + public void testSortWithNull() { + try (EsqlQueryResponse results = run("row a = null | sort a")) { + logger.info(results); + assertEquals(1, getValuesList(results).size()); + int countIndex = results.columns().indexOf(new ColumnInfoImpl("a", "null")); + assertThat(results.columns().stream().map(ColumnInfo::name).toList(), contains("a")); + assertThat(results.columns().stream().map(ColumnInfoImpl::type).toList(), contains(DataType.NULL)); + assertNull(getValuesList(results).getFirst().get(countIndex)); + } + } + + public void testStatsByNull() { + try (EsqlQueryResponse results = run("row a = null | stats by a")) { + logger.info(results); + assertEquals(1, getValuesList(results).size()); + int countIndex = results.columns().indexOf(new ColumnInfoImpl("a", "null")); + assertThat(results.columns().stream().map(ColumnInfo::name).toList(), contains("a")); + assertThat(results.columns().stream().map(ColumnInfoImpl::type).toList(), contains(DataType.NULL)); + assertNull(getValuesList(results).getFirst().get(countIndex)); + } + } + public void testStringLength() { try (EsqlQueryResponse results = run("from test | eval l = length(color)")) { logger.info(results); diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/AggregateExec.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/AggregateExec.java index 3c2d49567813c..6d3648d8e37b3 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/AggregateExec.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/AggregateExec.java @@ -136,6 +136,7 @@ public Integer estimatedRowSize() { public PhysicalPlan estimateRowSize(State state) { state.add(false, aggregates); // The groupings are contained within the aggregates int size = state.consumeAllFields(true); + size = Math.max(size, 1); return Objects.equals(this.estimatedRowSize, size) ? this : new AggregateExec(source(), child(), groupings, aggregates, mode, intermediateAttributes, size); diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/TopNExec.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/TopNExec.java index bbf0c681bec7d..c88e77e4972ca 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/TopNExec.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/TopNExec.java @@ -101,6 +101,7 @@ public PhysicalPlan estimateRowSize(State state) { final boolean needsSortedDocIds = output.stream().anyMatch(a -> a.dataType() == DataType.DOC_DATA_TYPE); state.add(needsSortedDocIds, output); int size = state.consumeAllFields(true); + size = Math.max(size, 1); return Objects.equals(this.estimatedRowSize, size) ? this : new TopNExec(source(), child(), order, limit, size); }