Skip to content

Commit 1e6f531

Browse files
committed
ESQL: Fix wrong marking of a field as unmapped when indices shared the same mapping
1 parent e091235 commit 1e6f531

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/IndexResolver.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ public void resolveAsMergedMapping(
9292

9393
// public for testing only
9494
public static IndexResolution mergedMappings(String indexPattern, FieldCapabilitiesResponse fieldCapsResponse) {
95-
var numberOfIndices = fieldCapsResponse.getIndexResponses().size();
9695
assert ThreadPool.assertCurrentThreadPool(ThreadPool.Names.SEARCH_COORDINATION); // too expensive to run this on a transport worker
9796
if (fieldCapsResponse.getIndexResponses().isEmpty()) {
9897
return IndexResolution.notFound(indexPattern);
@@ -143,8 +142,7 @@ public static IndexResolution mergedMappings(String indexPattern, FieldCapabilit
143142
);
144143
fields.put(name, field);
145144

146-
var isPartiallyUnmapped = fcs.size() < numberOfIndices;
147-
if (isPartiallyUnmapped) {
145+
if (fieldCapsResponse.getIndexResponses().stream().allMatch(fcir -> fcir.get().containsKey(fullName)) == false) {
148146
partiallyUnmappedFields.add(fullName);
149147
}
150148
}

x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/AnalyzerTests.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.elasticsearch.action.fieldcaps.FieldCapabilitiesResponse;
1313
import org.elasticsearch.action.fieldcaps.IndexFieldCapabilities;
1414
import org.elasticsearch.action.fieldcaps.IndexFieldCapabilitiesBuilder;
15+
import org.elasticsearch.common.hash.MessageDigests;
1516
import org.elasticsearch.common.lucene.BytesRefs;
1617
import org.elasticsearch.common.settings.Settings;
1718
import org.elasticsearch.index.IndexMode;
@@ -3101,6 +3102,27 @@ public void testResolveInsist_multiIndexFieldPartiallyExistsWithMultiTypesNoKeyw
31013102
assertThat(attr.unresolvedMessage(), is(expected));
31023103
}
31033104

3105+
public void testResolveInsist_multiIndexSameMapping_fieldIsMapped() {
3106+
assumeTrue("Requires UNMAPPED FIELDS", EsqlCapabilities.Cap.UNMAPPED_FIELDS.isEnabled());
3107+
3108+
IndexResolution resolution = IndexResolver.mergedMappings(
3109+
"foo, bar",
3110+
new FieldCapabilitiesResponse(
3111+
List.of(
3112+
fieldCapabilitiesIndexResponse("foo", messageResponseMap("long")),
3113+
fieldCapabilitiesIndexResponse("bar", messageResponseMap("long"))
3114+
),
3115+
List.of()
3116+
)
3117+
);
3118+
var plan = analyze("FROM foo, bar | INSIST_🐔 message", analyzer(resolution, TEST_VERIFIER));
3119+
var limit = as(plan, Limit.class);
3120+
var insist = as(limit.child(), Insist.class);
3121+
var attribute = (FieldAttribute) EsqlTestUtils.singleValue(insist.output());
3122+
assertThat(attribute.name(), is("message"));
3123+
assertThat(attribute.dataType(), is(DataType.LONG));
3124+
}
3125+
31043126
public void testResolveInsist_multiIndexFieldPartiallyExistsWithMultiTypesWithKeyword_createsAnInvalidMappedField() {
31053127
assumeTrue("Requires UNMAPPED FIELDS", EsqlCapabilities.Cap.UNMAPPED_FIELDS.isEnabled());
31063128

@@ -3531,7 +3553,8 @@ private static FieldCapabilitiesIndexResponse fieldCapabilitiesIndexResponse(
35313553
String indexName,
35323554
Map<String, IndexFieldCapabilities> fields
35333555
) {
3534-
return new FieldCapabilitiesIndexResponse(indexName, indexName, fields, false, IndexMode.STANDARD);
3556+
String indexMappingHash = new String(MessageDigests.sha256().digest(fields.toString().getBytes()));
3557+
return new FieldCapabilitiesIndexResponse(indexName, indexMappingHash, fields, false, IndexMode.STANDARD);
35353558
}
35363559

35373560
private static Map<String, IndexFieldCapabilities> messageResponseMap(String date) {

0 commit comments

Comments
 (0)