Skip to content

Commit b6454e9

Browse files
authored
Reject regexp queries on the _index field. (#46945)
We speculatively added support for `regexp` queries on the `_index` field in #34089 (this functionality was not actually requested by a user). Supporting regex logic adds complexity to the `_index` field for not much gain, so we would like to remove it. From an end-to-end test it turns out this functionality never even worked in the first place because of an error in how regex flags were interpreted! For this reason, we can remove support for `regexp` on `_index` without a deprecation period. Relates to #46640.
1 parent 93c854d commit b6454e9

File tree

2 files changed

+10
-22
lines changed

2 files changed

+10
-22
lines changed

server/src/main/java/org/elasticsearch/index/mapper/IndexFieldMapper.java

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import org.elasticsearch.common.Nullable;
2929
import org.elasticsearch.common.lucene.Lucene;
3030
import org.elasticsearch.common.lucene.search.Queries;
31-
import org.elasticsearch.common.regex.Regex;
3231
import org.elasticsearch.common.settings.Settings;
3332
import org.elasticsearch.common.xcontent.XContentBuilder;
3433
import org.elasticsearch.index.fielddata.IndexFieldData;
@@ -38,7 +37,6 @@
3837
import java.io.IOException;
3938
import java.util.List;
4039
import java.util.Map;
41-
import java.util.regex.Pattern;
4240

4341

4442
public class IndexFieldMapper extends MetadataFieldMapper {
@@ -175,20 +173,6 @@ public Query prefixQuery(String value,
175173
}
176174
}
177175

178-
@Override
179-
public Query regexpQuery(String value, int flags, int maxDeterminizedStates,
180-
MultiTermQuery.RewriteMethod method, QueryShardContext context) {
181-
String indexName = context.getFullyQualifiedIndex().getName();
182-
Pattern pattern = Regex.compile(value, Regex.flagsToString(flags));
183-
184-
if (pattern.matcher(indexName).matches()) {
185-
return Queries.newMatchAllQuery();
186-
} else {
187-
return Queries.newMatchNoDocsQuery("The index [" + context.getFullyQualifiedIndex().getName()
188-
+ "] doesn't match the provided pattern [" + value + "].");
189-
}
190-
}
191-
192176
@Override
193177
public Query wildcardQuery(String value,
194178
@Nullable MultiTermQuery.RewriteMethod method,

server/src/test/java/org/elasticsearch/index/mapper/IndexFieldTypeTests.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,12 @@
2727
import org.elasticsearch.common.settings.Settings;
2828
import org.elasticsearch.index.IndexSettings;
2929
import org.elasticsearch.index.query.QueryShardContext;
30+
import org.elasticsearch.index.query.QueryShardException;
3031

3132
import java.util.function.Predicate;
3233

34+
import static org.hamcrest.Matchers.containsString;
35+
3336
public class IndexFieldTypeTests extends FieldTypeTestCase {
3437

3538
@Override
@@ -46,22 +49,23 @@ public void testPrefixQuery() {
4649
assertEquals(new MatchNoDocsQuery(), ft.prefixQuery("other_ind", null, createContext()));
4750
}
4851

49-
public void testRegexpQuery() {
52+
public void testWildcardQuery() {
5053
MappedFieldType ft = createDefaultFieldType();
5154
ft.setName("field");
5255
ft.setIndexOptions(IndexOptions.DOCS);
5356

54-
assertEquals(new MatchAllDocsQuery(), ft.regexpQuery("ind.x", 0, 10, null, createContext()));
55-
assertEquals(new MatchNoDocsQuery(), ft.regexpQuery("ind?x", 0, 10, null, createContext()));
57+
assertEquals(new MatchAllDocsQuery(), ft.wildcardQuery("ind*x", null, createContext()));
58+
assertEquals(new MatchNoDocsQuery(), ft.wildcardQuery("other_ind*x", null, createContext()));
5659
}
5760

58-
public void testWildcardQuery() {
61+
public void testRegexpQuery() {
5962
MappedFieldType ft = createDefaultFieldType();
6063
ft.setName("field");
6164
ft.setIndexOptions(IndexOptions.DOCS);
6265

63-
assertEquals(new MatchAllDocsQuery(), ft.wildcardQuery("ind*x", null, createContext()));
64-
assertEquals(new MatchNoDocsQuery(), ft.wildcardQuery("other_ind*x", null, createContext()));
66+
QueryShardException e = expectThrows(QueryShardException.class, () ->
67+
assertEquals(new MatchAllDocsQuery(), ft.regexpQuery("ind.x", 0, 10, null, createContext())));
68+
assertThat(e.getMessage(), containsString("Can only use regexp queries on keyword and text fields"));
6569
}
6670

6771
private QueryShardContext createContext() {

0 commit comments

Comments
 (0)