Skip to content

Commit 9e62ccf

Browse files
authored
Fix flat_object parsing error when an object field name is too long (opensearch-project#13259)
--------- Signed-off-by: naomichi-y <n.yamakita@gmail.com>
1 parent 7c6127a commit 9e62ccf

File tree

3 files changed

+49
-4
lines changed

3 files changed

+49
-4
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6969
- Fix snapshot _status API to return correct status for partial snapshots ([#12812](https://github.com/opensearch-project/OpenSearch/pull/12812))
7070
- Improve the error messages for _stats with closed indices ([#13012](https://github.com/opensearch-project/OpenSearch/pull/13012))
7171
- Ignore BaseRestHandler unconsumed content check as it's always consumed. ([#13290](https://github.com/opensearch-project/OpenSearch/pull/13290))
72+
- Fix mapper_parsing_exception when using flat_object fields with names longer than 11 characters ([#13259](https://github.com/opensearch-project/OpenSearch/pull/13259))
7273

7374
### Security
7475

server/src/main/java/org/opensearch/common/xcontent/JsonToStringXContentParser.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,9 @@ private void parseToken(StringBuilder path, String currentFieldName) throws IOEx
106106
// skip
107107
} else if (this.parser.currentToken() == Token.START_OBJECT) {
108108
parseToken(path, currentFieldName);
109-
int dotIndex = path.lastIndexOf(DOT_SYMBOL);
110-
if (dotIndex != -1) {
109+
int dotIndex = path.lastIndexOf(DOT_SYMBOL, path.length());
110+
111+
if (dotIndex != -1 && path.length() > currentFieldName.length()) {
111112
path.setLength(path.length() - currentFieldName.length() - 1);
112113
}
113114
} else {
@@ -117,8 +118,8 @@ private void parseToken(StringBuilder path, String currentFieldName) throws IOEx
117118
parseValue(parsedFields);
118119
this.valueList.add(parsedFields.toString());
119120
this.valueAndPathList.add(path + EQUAL_SYMBOL + parsedFields);
120-
int dotIndex = path.lastIndexOf(DOT_SYMBOL);
121-
if (dotIndex != -1) {
121+
int dotIndex = path.lastIndexOf(DOT_SYMBOL, path.length());
122+
if (dotIndex != -1 && path.length() > currentFieldName.length()) {
122123
path.setLength(path.length() - currentFieldName.length() - 1);
123124
}
124125
}

server/src/test/java/org/opensearch/index/mapper/FlatObjectFieldDataTests.java

+43
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,49 @@ public void testDocValue() throws Exception {
5454
assertEquals(1, valueReaders.size());
5555
}
5656

57+
public void testLongFieldNameWithHashArray() throws Exception {
58+
String mapping = XContentFactory.jsonBuilder()
59+
.startObject()
60+
.startObject("test")
61+
.startObject("properties")
62+
.startObject("field")
63+
.field("type", FIELD_TYPE)
64+
.endObject()
65+
.endObject()
66+
.endObject()
67+
.endObject()
68+
.toString();
69+
final DocumentMapper mapper = mapperService.documentMapperParser().parse("test", new CompressedXContent(mapping));
70+
71+
XContentBuilder json = XContentFactory.jsonBuilder()
72+
.startObject()
73+
.startObject("field")
74+
.startObject("detail")
75+
.startArray("fooooooooooo")
76+
.startObject()
77+
.field("name", "baz")
78+
.endObject()
79+
.startObject()
80+
.field("name", "baz")
81+
.endObject()
82+
.endArray()
83+
.endObject()
84+
.endObject()
85+
.endObject();
86+
87+
ParsedDocument d = mapper.parse(new SourceToParse("test", "1", BytesReference.bytes(json), MediaTypeRegistry.JSON));
88+
writer.addDocument(d.rootDoc());
89+
writer.commit();
90+
91+
IndexFieldData<?> fieldData = getForField("field");
92+
List<LeafReaderContext> readers = refreshReader();
93+
assertEquals(1, readers.size());
94+
95+
IndexFieldData<?> valueFieldData = getForField("field._value");
96+
List<LeafReaderContext> valueReaders = refreshReader();
97+
assertEquals(1, valueReaders.size());
98+
}
99+
57100
@Override
58101
protected String getFieldDataType() {
59102
return FIELD_TYPE;

0 commit comments

Comments
 (0)