Skip to content

Commit 41116eb

Browse files
committed
Do not throw errors on unknown types in SearchAfterBuilder (#48147)
* Do not throw errors on unknown types in SearchAfterBuilder The support for BigInteger and BigDecimal was added for XContent in #32888. However the SearchAfterBuilder xcontent parser doesn't expect them to be present so it throws an AssertionError. This change fixes this discrepancy by changing the AssertionError into an IllegalArgumentException that will not cause the node to die when thrown. Closes #48074
1 parent 96556d7 commit 41116eb

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

server/src/main/java/org/elasticsearch/search/searchafter/SearchAfterBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,8 @@ public static SearchAfterBuilder fromXContent(XContentParser parser) throws IOEx
243243
break;
244244

245245
default:
246-
throw new AssertionError("Unknown number type []" + parser.numberType());
246+
throw new IllegalArgumentException("[search_after] does not accept numbers of type ["
247+
+ parser.numberType() + "], got " + parser.text());
247248
}
248249
} else if (token == XContentParser.Token.VALUE_STRING) {
249250
values.add(parser.text());

server/src/test/java/org/elasticsearch/search/searchafter/SearchAfterBuilderTests.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,13 @@
3838
import org.elasticsearch.test.ESTestCase;
3939

4040
import java.io.IOException;
41+
import java.math.BigDecimal;
42+
import java.math.BigInteger;
4143
import java.util.Collections;
4244

4345
import static org.elasticsearch.search.searchafter.SearchAfterBuilder.extractSortType;
4446
import static org.elasticsearch.test.EqualsHashCodeTestUtils.checkEqualsAndHashCode;
47+
import static org.hamcrest.Matchers.containsString;
4548
import static org.hamcrest.Matchers.equalTo;
4649

4750
public class SearchAfterBuilderTests extends ESTestCase {
@@ -187,6 +190,44 @@ public void testFromXContent() throws Exception {
187190
}
188191
}
189192

193+
public void testFromXContentIllegalType() throws Exception {
194+
for (XContentType type : XContentType.values()) {
195+
// BIG_INTEGER
196+
XContentBuilder xContent = XContentFactory.contentBuilder(type);
197+
xContent.startObject()
198+
.startArray("search_after")
199+
.value(new BigInteger("9223372036854776000"))
200+
.endArray()
201+
.endObject();
202+
try (XContentParser parser = createParser(xContent)) {
203+
parser.nextToken();
204+
parser.nextToken();
205+
parser.nextToken();
206+
IllegalArgumentException exc = expectThrows(IllegalArgumentException.class, () -> SearchAfterBuilder.fromXContent(parser));
207+
assertThat(exc.getMessage(), containsString("BIG_INTEGER"));
208+
}
209+
210+
// BIG_DECIMAL
211+
// ignore json and yaml, they parse floating point numbers as floats/doubles
212+
if (type == XContentType.JSON || type == XContentType.YAML) {
213+
continue;
214+
}
215+
xContent = XContentFactory.contentBuilder(type);
216+
xContent.startObject()
217+
.startArray("search_after")
218+
.value(new BigDecimal("9223372036854776003.3"))
219+
.endArray()
220+
.endObject();
221+
try (XContentParser parser = createParser(xContent)) {
222+
parser.nextToken();
223+
parser.nextToken();
224+
parser.nextToken();
225+
IllegalArgumentException exc = expectThrows(IllegalArgumentException.class, () -> SearchAfterBuilder.fromXContent(parser));
226+
assertThat(exc.getMessage(), containsString("BIG_DECIMAL"));
227+
}
228+
}
229+
}
230+
190231
public void testWithNullArray() throws Exception {
191232
SearchAfterBuilder builder = new SearchAfterBuilder();
192233
try {

0 commit comments

Comments
 (0)