diff --git a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/RankFeaturesFieldMapperTests.java b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/RankFeaturesFieldMapperTests.java index 17aff81a6711b..7da4dfecd0e54 100644 --- a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/RankFeaturesFieldMapperTests.java +++ b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/RankFeaturesFieldMapperTests.java @@ -145,4 +145,9 @@ protected Object generateRandomInputValue(MappedFieldType ft) { assumeFalse("Test implemented in a follow up", true); return null; } + + @Override + protected boolean allowsNullValues() { + return false; // TODO should this allow null values? + } } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/GeoShapeFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/GeoShapeFieldMapper.java index 50a9e0730f8ff..131eddaf577a0 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/GeoShapeFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/GeoShapeFieldMapper.java @@ -199,6 +199,9 @@ protected void checkIncomingMergeType(FieldMapper mergeWith) { @Override protected void index(ParseContext context, Geometry geometry) throws IOException { + if (geometry == null) { + return; + } context.doc().addAll(indexer.indexShape(geometry)); createFieldNamesField(context); } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/LegacyGeoShapeFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/LegacyGeoShapeFieldMapper.java index 0b8cd6fd80532..8d8d85c2a190c 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/LegacyGeoShapeFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/LegacyGeoShapeFieldMapper.java @@ -468,6 +468,9 @@ String strategy() { @Override protected void index(ParseContext context, ShapeBuilder shapeBuilder) throws IOException { + if (shapeBuilder == null) { + return; + } Shape shape = shapeBuilder.buildS4J(); if (fieldType().pointsOnly()) { // index configured for pointsOnly diff --git a/test/framework/src/main/java/org/elasticsearch/index/mapper/MapperTestCase.java b/test/framework/src/main/java/org/elasticsearch/index/mapper/MapperTestCase.java index 9388739b8fe2c..f29418e25645e 100644 --- a/test/framework/src/main/java/org/elasticsearch/index/mapper/MapperTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/index/mapper/MapperTestCase.java @@ -684,4 +684,19 @@ private BiFunction, IndexFieldData> f .fielddataBuilder("test", lookupSource) .build(new IndexFieldDataCache.None(), new NoneCircuitBreakerService()); } + + public final void testNullInput() throws Exception { + DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping)); + if (allowsNullValues()) { + ParsedDocument doc = mapper.parse(source(b -> b.nullField("field"))); + assertThat(doc.docs().get(0).getFields("field").length, equalTo(0)); + assertThat(doc.docs().get(0).getFields("_field_names").length, equalTo(0)); + } else { + expectThrows(MapperParsingException.class, () -> mapper.parse(source(b -> b.nullField("field")))); + } + } + + protected boolean allowsNullValues() { + return true; + } } diff --git a/x-pack/plugin/mapper-constant-keyword/src/internalClusterTest/java/org/elasticsearch/xpack/constantkeyword/mapper/ConstantKeywordFieldMapperTests.java b/x-pack/plugin/mapper-constant-keyword/src/internalClusterTest/java/org/elasticsearch/xpack/constantkeyword/mapper/ConstantKeywordFieldMapperTests.java index cac047f237f14..a4462a1312933 100644 --- a/x-pack/plugin/mapper-constant-keyword/src/internalClusterTest/java/org/elasticsearch/xpack/constantkeyword/mapper/ConstantKeywordFieldMapperTests.java +++ b/x-pack/plugin/mapper-constant-keyword/src/internalClusterTest/java/org/elasticsearch/xpack/constantkeyword/mapper/ConstantKeywordFieldMapperTests.java @@ -177,4 +177,9 @@ protected String generateRandomInputValue(MappedFieldType ft) { protected void randomFetchTestFieldConfig(XContentBuilder b) throws IOException { b.field("type", "constant_keyword").field("value", randomAlphaOfLengthBetween(1, 10)); } + + @Override + protected boolean allowsNullValues() { + return false; // null is an error for constant keyword + } } diff --git a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/GeoShapeWithDocValuesFieldMapper.java b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/GeoShapeWithDocValuesFieldMapper.java index b174910b7625e..7811b67ef2e82 100644 --- a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/GeoShapeWithDocValuesFieldMapper.java +++ b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/GeoShapeWithDocValuesFieldMapper.java @@ -207,6 +207,9 @@ public GeoShapeWithDocValuesFieldMapper(String simpleName, MappedFieldType mappe @Override protected void index(ParseContext context, Geometry geometry) throws IOException { + if (geometry == null) { + return; + } List fields = indexer.indexShape(geometry); if (fieldType().isSearchable()) { context.doc().addAll(fields); diff --git a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/ShapeFieldMapper.java b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/ShapeFieldMapper.java index aae8c7f464726..cf67d7b9a56ea 100644 --- a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/ShapeFieldMapper.java +++ b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/ShapeFieldMapper.java @@ -137,6 +137,9 @@ public ShapeFieldMapper(String simpleName, MappedFieldType mappedFieldType, @Override protected void index(ParseContext context, Geometry geometry) throws IOException { + if (geometry == null) { + return; + } context.doc().addAll(indexer.indexShape(geometry)); createFieldNamesField(context); } diff --git a/x-pack/plugin/vectors/src/test/java/org/elasticsearch/xpack/vectors/mapper/DenseVectorFieldMapperTests.java b/x-pack/plugin/vectors/src/test/java/org/elasticsearch/xpack/vectors/mapper/DenseVectorFieldMapperTests.java index d7f43c1cee924..51b560f21a809 100644 --- a/x-pack/plugin/vectors/src/test/java/org/elasticsearch/xpack/vectors/mapper/DenseVectorFieldMapperTests.java +++ b/x-pack/plugin/vectors/src/test/java/org/elasticsearch/xpack/vectors/mapper/DenseVectorFieldMapperTests.java @@ -166,4 +166,9 @@ protected Object generateRandomInputValue(MappedFieldType ft) { assumeFalse("Test implemented in a follow up", true); return null; } + + @Override + protected boolean allowsNullValues() { + return false; // TODO should this allow null values? + } } diff --git a/x-pack/plugin/vectors/src/test/java/org/elasticsearch/xpack/vectors/mapper/SparseVectorFieldMapperTests.java b/x-pack/plugin/vectors/src/test/java/org/elasticsearch/xpack/vectors/mapper/SparseVectorFieldMapperTests.java index 8a3bc48a81108..7a3df53a79ad9 100644 --- a/x-pack/plugin/vectors/src/test/java/org/elasticsearch/xpack/vectors/mapper/SparseVectorFieldMapperTests.java +++ b/x-pack/plugin/vectors/src/test/java/org/elasticsearch/xpack/vectors/mapper/SparseVectorFieldMapperTests.java @@ -246,4 +246,9 @@ protected Object generateRandomInputValue(MappedFieldType ft) { assumeFalse("doesn't support docvalues_fetcher", true); return null; } + + @Override + protected boolean allowsNullValues() { + return false; + } }