Skip to content

Commit 407cd8b

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

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,7 @@ public static IndexResolution mergedMappings(String indexPattern, FieldCapabilit
143143
);
144144
fields.put(name, field);
145145

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

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)