diff options
3 files changed, 17 insertions, 1 deletions
diff --git a/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java b/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java index abfbd37671..37d7eb5b02 100644 --- a/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java +++ b/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java @@ -38,11 +38,11 @@ import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryParseContext; import org.elasticsearch.index.query.QueryShardContext; import org.elasticsearch.script.Script; -import org.elasticsearch.search.collapse.CollapseBuilder; import org.elasticsearch.search.SearchExtBuilder; import org.elasticsearch.search.aggregations.AggregationBuilder; import org.elasticsearch.search.aggregations.AggregatorFactories; import org.elasticsearch.search.aggregations.PipelineAggregationBuilder; +import org.elasticsearch.search.collapse.CollapseBuilder; import org.elasticsearch.search.fetch.StoredFieldsContext; import org.elasticsearch.search.fetch.subphase.FetchSourceContext; import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; @@ -314,6 +314,9 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ * From index to start the search from. Defaults to <tt>0</tt>. */ public SearchSourceBuilder from(int from) { + if (from < 0) { + throw new IllegalArgumentException("[from] parameter cannot be negative"); + } this.from = from; return this; } diff --git a/core/src/test/java/org/elasticsearch/search/builder/SearchSourceBuilderTests.java b/core/src/test/java/org/elasticsearch/search/builder/SearchSourceBuilderTests.java index ef1750a448..cb4982d769 100644 --- a/core/src/test/java/org/elasticsearch/search/builder/SearchSourceBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/search/builder/SearchSourceBuilderTests.java @@ -360,6 +360,11 @@ public class SearchSourceBuilderTests extends AbstractSearchTestCase { } } + public void testNegativeFromErrors() { + IllegalArgumentException expected = expectThrows(IllegalArgumentException.class, () -> new SearchSourceBuilder().from(-2)); + assertEquals("[from] parameter cannot be negative", expected.getMessage()); + } + private void assertIndicesBoostParseErrorMessage(String restContent, String expectedErrorMessage) throws IOException { try (XContentParser parser = createParser(JsonXContent.jsonXContent, restContent)) { ParsingException e = expectThrows(ParsingException.class, () -> SearchSourceBuilder.fromXContent(createParseContext(parser))); diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/search/30_limits.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/search/30_limits.yaml index a93cefff69..49c9333c48 100644 --- a/rest-api-spec/src/main/resources/rest-api-spec/test/search/30_limits.yaml +++ b/rest-api-spec/src/main/resources/rest-api-spec/test/search/30_limits.yaml @@ -18,6 +18,14 @@ setup: from: 10000 --- +"Request with negative from value": + - do: + catch: /\[from\] parameter cannot be negative/ + search: + index: test_1 + from: -2 + +--- "Request window limits with scroll": - do: catch: /Batch size is too large, size must be less than or equal to[:] \[10000\] but was \[10010\]\. Scroll batch sizes cost as much memory as result windows so they are controlled by the \[index.max_result_window\] index level setting\./ |