Skip to content

Commit

Permalink
[Backport 2.x] Fix array_index_out_of_bounds_exception when indexing …
Browse files Browse the repository at this point in the history
…documents with field name containing only dot (#15188)

* Fix array_index_out_of_bounds_exception when indexing documents with field name containing only dot (#15126)

* Fix array_index_out_of_bounds_exception when indexing documents with field name containing only dot

Signed-off-by: Gao Binlong <gbinlong@amazon.com>

* Modify change log

Signed-off-by: Gao Binlong <gbinlong@amazon.com>

* Optimize error message

Signed-off-by: Gao Binlong <gbinlong@amazon.com>

---------

Signed-off-by: Gao Binlong <gbinlong@amazon.com>
(cherry picked from commit 252742b)
Signed-off-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* Update 120_field_name.yml

Signed-off-by: Andriy Redko <andriy.redko@aiven.io>

---------

Signed-off-by: Gao Binlong <gbinlong@amazon.com>
Signed-off-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Signed-off-by: Andriy Redko <andriy.redko@aiven.io>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Andriy Redko <andriy.redko@aiven.io>
  • Loading branch information
3 people authored Aug 9, 2024
1 parent fef2003 commit 76f3b0a
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
- Fix constraint bug which allows more primary shards than average primary shards per index ([#14908](https://github.com/opensearch-project/OpenSearch/pull/14908))
- Fix missing value of FieldSort for unsigned_long ([#14963](https://github.com/opensearch-project/OpenSearch/pull/14963))
- Fix delete index template failed when the index template matches a data stream but is unused ([#15080](https://github.com/opensearch-project/OpenSearch/pull/15080))
- Fix array_index_out_of_bounds_exception when indexing documents with field name containing only dot ([#15126](https://github.com/opensearch-project/OpenSearch/pull/15126))

### Security

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
"Index documents with field name containing only dot fail with an IllegalArgumentException":
- skip:
version: " - 2.16.99"
reason: "introduced in 2.17.0"

- do:
indices.create:
index: test_1

- do:
catch: /field name cannot contain only the character \[.\]/
index:
index: test_1
id: 1
body: {
.: bar
}

- do:
catch: /field name cannot contain only the character \[.\]/
index:
index: test_1
id: 1
body: {
..: bar
}

- do:
catch: /field name cannot contain only the character \[.\]/
index:
index: test_1
id: 1
body: {
foo: {
.: bar
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,9 @@ private static MapperParsingException wrapInMapperParsingException(SourceToParse
private static String[] splitAndValidatePath(String fullFieldPath) {
if (fullFieldPath.contains(".")) {
String[] parts = fullFieldPath.split("\\.");
if (parts.length == 0) {
throw new IllegalArgumentException("field name cannot contain only the character [.]");
}
for (String part : parts) {
if (Strings.hasText(part) == false) {
// check if the field name contains only whitespace
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1700,6 +1700,38 @@ public void testDynamicFieldsStartingAndEndingWithDot() throws Exception {
);
}

public void testDynamicFieldsWithOnlyDot() throws Exception {
DocumentMapper mapper = createDocumentMapper(mapping(b -> {}));

MapperParsingException e = expectThrows(MapperParsingException.class, () -> mapper.parse(source(b -> {
b.startArray("top");
{
b.startObject();
{
b.startObject("inner").field(".", 2).endObject();
}
b.endObject();
}
b.endArray();
})));

assertThat(e.getCause(), notNullValue());
assertThat(e.getCause().getMessage(), containsString("field name cannot contain only the character [.]"));

e = expectThrows(
MapperParsingException.class,
() -> mapper.parse(source(b -> { b.startObject("..").field("foo", 2).endObject(); }))
);

assertThat(e.getCause(), notNullValue());
assertThat(e.getCause().getMessage(), containsString("field name cannot contain only the character [.]"));

e = expectThrows(MapperParsingException.class, () -> mapper.parse(source(b -> b.field(".", "1234"))));

assertThat(e.getCause(), notNullValue());
assertThat(e.getCause().getMessage(), containsString("field name cannot contain only the character [.]"));
}

public void testDynamicFieldsEmptyName() throws Exception {

DocumentMapper mapper = createDocumentMapper(mapping(b -> {}));
Expand Down

0 comments on commit 76f3b0a

Please sign in to comment.