Skip to content

Commit a9d2b1d

Browse files
tony-dillonjimczi
authored andcommitted
Null completion field should not throw IAE (#33268)
Ignore null value on the completion field Closes #33200
1 parent 0bf3625 commit a9d2b1d

File tree

3 files changed

+14
-32
lines changed

3 files changed

+14
-32
lines changed

server/src/main/java/org/elasticsearch/index/mapper/CompletionFieldMapper.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -435,8 +435,10 @@ public Mapper parse(ParseContext context) throws IOException {
435435
XContentParser parser = context.parser();
436436
Token token = parser.currentToken();
437437
Map<String, CompletionInputMetaData> inputMap = new HashMap<>(1);
438+
439+
// ignore null values
438440
if (token == Token.VALUE_NULL) {
439-
throw new MapperParsingException("completion field [" + fieldType().name() + "] does not support null values");
441+
return null;
440442
} else if (token == Token.START_ARRAY) {
441443
while ((token = parser.nextToken()) != Token.END_ARRAY) {
442444
parse(context, token, parser, inputMap);

server/src/test/java/org/elasticsearch/index/mapper/CompletionFieldMapperTests.java

+11
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,17 @@ public void testFieldValueValidation() throws Exception {
448448
assertNotNull(doc.docs().get(0).getField("_ignored"));
449449
IndexableField ignoredFields = doc.docs().get(0).getField("_ignored");
450450
assertThat(ignoredFields.stringValue(), equalTo("completion"));
451+
452+
// null inputs are ignored
453+
ParsedDocument nullDoc = defaultMapper.parse(SourceToParse.source("test", "type1", "1", BytesReference
454+
.bytes(XContentFactory.jsonBuilder()
455+
.startObject()
456+
.nullField("completion")
457+
.endObject()),
458+
XContentType.JSON));
459+
assertThat(nullDoc.docs().size(), equalTo(1));
460+
assertNull(nullDoc.docs().get(0).get("completion"));
461+
assertNull(nullDoc.docs().get(0).getField("_ignored"));
451462
}
452463

453464
public void testPrefixQueryType() throws Exception {

server/src/test/java/org/elasticsearch/search/suggest/CompletionSuggestSearchIT.java

-31
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,10 @@
3131
import org.elasticsearch.action.search.SearchResponse;
3232
import org.elasticsearch.action.support.master.AcknowledgedResponse;
3333
import org.elasticsearch.common.FieldMemoryStats;
34-
import org.elasticsearch.common.Strings;
3534
import org.elasticsearch.common.settings.Settings;
3635
import org.elasticsearch.common.unit.Fuzziness;
3736
import org.elasticsearch.common.xcontent.XContentBuilder;
3837
import org.elasticsearch.common.xcontent.XContentFactory;
39-
import org.elasticsearch.common.xcontent.XContentType;
4038
import org.elasticsearch.index.mapper.MapperParsingException;
4139
import org.elasticsearch.plugins.Plugin;
4240
import org.elasticsearch.search.aggregations.AggregationBuilders;
@@ -1111,35 +1109,6 @@ public void testIssue5930() throws IOException {
11111109
}
11121110
}
11131111

1114-
// see issue #6399
1115-
public void testIndexingUnrelatedNullValue() throws Exception {
1116-
String mapping = Strings
1117-
.toString(jsonBuilder()
1118-
.startObject()
1119-
.startObject(TYPE)
1120-
.startObject("properties")
1121-
.startObject(FIELD)
1122-
.field("type", "completion")
1123-
.endObject()
1124-
.endObject()
1125-
.endObject()
1126-
.endObject());
1127-
1128-
assertAcked(client().admin().indices().prepareCreate(INDEX).addMapping(TYPE, mapping, XContentType.JSON).get());
1129-
ensureGreen();
1130-
1131-
client().prepareIndex(INDEX, TYPE, "1").setSource(FIELD, "strings make me happy", FIELD + "_1", "nulls make me sad")
1132-
.setRefreshPolicy(IMMEDIATE).get();
1133-
1134-
try {
1135-
client().prepareIndex(INDEX, TYPE, "2").setSource(FIELD, null, FIELD + "_1", "nulls make me sad").get();
1136-
fail("Expected MapperParsingException for null value");
1137-
} catch (MapperParsingException e) {
1138-
// make sure that the exception has the name of the field causing the error
1139-
assertTrue(e.getDetailedMessage().contains(FIELD));
1140-
}
1141-
}
1142-
11431112
public void testMultiDocSuggestions() throws Exception {
11441113
final CompletionMappingBuilder mapping = new CompletionMappingBuilder();
11451114
createIndexAndMapping(mapping);

0 commit comments

Comments
 (0)