Skip to content

Commit 0848ffd

Browse files
honourednihilistjpountz
authored andcommitted
Fixed bug that mapper_parsing_exception is thrown for numeric field with ignore_malformed=true when inserting "NaN", "Infinity" or "-Infinity" values (#25967)
1 parent 2b0f428 commit 0848ffd

File tree

2 files changed

+28
-13
lines changed

2 files changed

+28
-13
lines changed

core/src/main/java/org/elasticsearch/index/mapper/ScaledFloatFieldMapper.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -399,8 +399,12 @@ protected void parseCreateField(ParseContext context, List<IndexableField> field
399399

400400
double doubleValue = numericValue.doubleValue();
401401
if (Double.isFinite(doubleValue) == false) {
402-
// since we encode to a long, we have no way to carry NaNs and infinities
403-
throw new IllegalArgumentException("[scaled_float] only supports finite values, but got [" + doubleValue + "]");
402+
if (ignoreMalformed.value()) {
403+
return;
404+
} else {
405+
// since we encode to a long, we have no way to carry NaNs and infinities
406+
throw new IllegalArgumentException("[scaled_float] only supports finite values, but got [" + doubleValue + "]");
407+
}
404408
}
405409
long scaledValue = Math.round(doubleValue * fieldType().getScalingFactor());
406410

core/src/test/java/org/elasticsearch/index/mapper/ScaledFloatFieldMapperTests.java

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@
3131
import org.junit.Before;
3232

3333
import java.io.IOException;
34+
import java.util.Arrays;
3435
import java.util.Collection;
36+
import java.util.List;
3537

3638
import static org.hamcrest.Matchers.containsString;
3739

@@ -223,37 +225,46 @@ public void testCoerce() throws Exception {
223225
}
224226

225227
public void testIgnoreMalformed() throws Exception {
228+
doTestIgnoreMalformed("a", "For input string: \"a\"");
229+
230+
List<String> values = Arrays.asList("NaN", "Infinity", "-Infinity");
231+
for (String value : values) {
232+
doTestIgnoreMalformed(value, "[scaled_float] only supports finite values, but got [" + value + "]");
233+
}
234+
}
235+
236+
private void doTestIgnoreMalformed(String value, String exceptionMessageContains) throws Exception {
226237
String mapping = XContentFactory.jsonBuilder().startObject().startObject("type")
227-
.startObject("properties").startObject("field").field("type", "scaled_float")
228-
.field("scaling_factor", 10.0).endObject().endObject()
229-
.endObject().endObject().string();
238+
.startObject("properties").startObject("field").field("type", "scaled_float")
239+
.field("scaling_factor", 10.0).endObject().endObject()
240+
.endObject().endObject().string();
230241

231242
DocumentMapper mapper = parser.parse("type", new CompressedXContent(mapping));
232243

233244
assertEquals(mapping, mapper.mappingSource().toString());
234245

235246
ThrowingRunnable runnable = () -> mapper.parse(SourceToParse.source("test", "type", "1", XContentFactory.jsonBuilder()
236247
.startObject()
237-
.field("field", "a")
248+
.field("field", value)
238249
.endObject()
239250
.bytes(),
240-
XContentType.JSON));
251+
XContentType.JSON));
241252
MapperParsingException e = expectThrows(MapperParsingException.class, runnable);
242-
assertThat(e.getCause().getMessage(), containsString("For input string: \"a\""));
253+
assertThat(e.getCause().getMessage(), containsString(exceptionMessageContains));
243254

244255
mapping = XContentFactory.jsonBuilder().startObject().startObject("type")
245-
.startObject("properties").startObject("field").field("type", "scaled_float")
246-
.field("scaling_factor", 10.0).field("ignore_malformed", true).endObject().endObject()
247-
.endObject().endObject().string();
256+
.startObject("properties").startObject("field").field("type", "scaled_float")
257+
.field("scaling_factor", 10.0).field("ignore_malformed", true).endObject().endObject()
258+
.endObject().endObject().string();
248259

249260
DocumentMapper mapper2 = parser.parse("type", new CompressedXContent(mapping));
250261

251262
ParsedDocument doc = mapper2.parse(SourceToParse.source("test", "type", "1", XContentFactory.jsonBuilder()
252263
.startObject()
253-
.field("field", "a")
264+
.field("field", value)
254265
.endObject()
255266
.bytes(),
256-
XContentType.JSON));
267+
XContentType.JSON));
257268

258269
IndexableField[] fields = doc.rootDoc().getFields("field");
259270
assertEquals(0, fields.length);

0 commit comments

Comments
 (0)