diff --git a/server/src/main/java/org/elasticsearch/search/fetch/StoredFieldsSpec.java b/server/src/main/java/org/elasticsearch/search/fetch/StoredFieldsSpec.java index f5eee3d8d5502..fcf5d474a8184 100644 --- a/server/src/main/java/org/elasticsearch/search/fetch/StoredFieldsSpec.java +++ b/server/src/main/java/org/elasticsearch/search/fetch/StoredFieldsSpec.java @@ -82,9 +82,17 @@ public StoredFieldsSpec merge(StoredFieldsSpec other) { mergedSourcePaths = new HashSet<>(this.sourcePaths); mergedSourcePaths.addAll(other.sourcePaths); } else if (this.sourcePaths.isEmpty() == false) { - mergedSourcePaths = this.sourcePaths; + if (other.requiresSource) { + mergedSourcePaths = Set.of(); + } else { + mergedSourcePaths = this.sourcePaths; + } } else if (other.sourcePaths.isEmpty() == false) { - mergedSourcePaths = other.sourcePaths; + if (this.requiresSource) { + mergedSourcePaths = Set.of(); + } else { + mergedSourcePaths = other.sourcePaths; + } } else { mergedSourcePaths = Set.of(); } diff --git a/server/src/test/java/org/elasticsearch/search/fetch/StoredFieldsSpecTests.java b/server/src/test/java/org/elasticsearch/search/fetch/StoredFieldsSpecTests.java index 7c66d91ac7a0a..d322e552d8899 100644 --- a/server/src/test/java/org/elasticsearch/search/fetch/StoredFieldsSpecTests.java +++ b/server/src/test/java/org/elasticsearch/search/fetch/StoredFieldsSpecTests.java @@ -120,7 +120,7 @@ public void testMergeSourcePaths() { spec = spec.merge( new StoredFieldsSpec( - true, + false, false, Set.of("other_field"), IgnoredSourceFieldMapper.IgnoredSourceFormat.NO_IGNORED_SOURCE, @@ -133,6 +133,16 @@ public void testMergeSourcePaths() { assertThat(spec.requiredStoredFields(), containsInAnyOrder("other_field")); assertThat(spec.sourcePaths(), containsInAnyOrder("cat", "dog", "hamster")); assertThat(spec.sourcePaths(), sameInstance(pref)); + + // Clears source paths, because the spec requires complete source (since no source paths are defined) + spec = spec.merge( + new StoredFieldsSpec(true, false, Set.of(), IgnoredSourceFieldMapper.IgnoredSourceFormat.NO_IGNORED_SOURCE, Set.of()) + ); + assertThat(spec.ignoredSourceFormat(), equalTo(IgnoredSourceFieldMapper.IgnoredSourceFormat.NO_IGNORED_SOURCE)); + assertThat(spec.requiresSource(), equalTo(true)); + assertThat(spec.requiresMetadata(), equalTo(false)); + assertThat(spec.requiredStoredFields(), containsInAnyOrder("other_field")); + assertThat(spec.sourcePaths(), empty()); } private static SearchContext searchContext(SearchSourceBuilder sourceBuilder) { diff --git a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/140_metadata.yml b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/140_metadata.yml index 35cfbac5e3439..e8aab61ddb6f3 100644 --- a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/140_metadata.yml +++ b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/140_metadata.yml @@ -210,3 +210,35 @@ setup: "keyword" : "ok", "case" : "ok" }} + +--- +"source meta field and dynamic false": + - do: + indices.create: + index: my-index2 + body: + mappings: + dynamic: false + properties: + foo: + type: text + + - do: + bulk: + index: my-index2 + refresh: true + body: + - { "index": { } } + - { "baz": "dasd" } + - do: + esql.query: + body: + query: 'FROM my-index2 METADATA _source | LIMIT 10' + + - match: {columns.0.name: "foo"} + - match: {columns.0.type: "text"} + - match: {columns.1.name: "_source"} + - match: {columns.1.type: "_source"} + + - match: {values.0.0: null} + - match: {values.0.1: { "baz": "dasd" }}