diff --git a/docs/changelog/130947.yaml b/docs/changelog/130947.yaml new file mode 100644 index 0000000000000..bcca93dbc681a --- /dev/null +++ b/docs/changelog/130947.yaml @@ -0,0 +1,5 @@ +pr: 130947 +summary: "[main]Prepare Index Like fix for backport to 9.1 and 8.19" +area: ES|QL +type: bug +issues: [] diff --git a/server/src/main/java/org/elasticsearch/TransportVersions.java b/server/src/main/java/org/elasticsearch/TransportVersions.java index 70727715a91c0..ae0ccecf15ed7 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersions.java +++ b/server/src/main/java/org/elasticsearch/TransportVersions.java @@ -211,6 +211,7 @@ static TransportVersion def(int id) { public static final TransportVersion ESQL_DOCUMENTS_FOUND_AND_VALUES_LOADED_8_19 = def(8_841_0_61); public static final TransportVersion ESQL_PROFILE_INCLUDE_PLAN_8_19 = def(8_841_0_62); public static final TransportVersion ESQL_SPLIT_ON_BIG_VALUES_8_19 = def(8_841_0_63); + public static final TransportVersion ESQL_FIXED_INDEX_LIKE_8_19 = def(8_841_0_64); public static final TransportVersion V_9_0_0 = def(9_000_0_09); public static final TransportVersion INITIAL_ELASTICSEARCH_9_0_1 = def(9_000_0_10); public static final TransportVersion INITIAL_ELASTICSEARCH_9_0_2 = def(9_000_0_11); @@ -328,6 +329,7 @@ static TransportVersion def(int id) { public static final TransportVersion ESQL_PROFILE_INCLUDE_PLAN = def(9_111_0_00); public static final TransportVersion MAPPINGS_IN_DATA_STREAMS = def(9_112_0_00); public static final TransportVersion ESQL_SPLIT_ON_BIG_VALUES_9_1 = def(9_112_0_01); + public static final TransportVersion ESQL_FIXED_INDEX_LIKE_9_1 = def(9_112_0_02); // Below is the first version in 9.2 and NOT in 9.1. public static final TransportVersion PROJECT_STATE_REGISTRY_RECORDS_DELETIONS = def(9_113_0_00); public static final TransportVersion ESQL_SERIALIZE_TIMESERIES_FIELD_TYPE = def(9_114_0_00); diff --git a/server/src/main/java/org/elasticsearch/index/query/WildcardQueryBuilder.java b/server/src/main/java/org/elasticsearch/index/query/WildcardQueryBuilder.java index b79731f4ef3d1..a1eadb9ae7a5a 100644 --- a/server/src/main/java/org/elasticsearch/index/query/WildcardQueryBuilder.java +++ b/server/src/main/java/org/elasticsearch/index/query/WildcardQueryBuilder.java @@ -104,7 +104,7 @@ public WildcardQueryBuilder(StreamInput in) throws IOException { value = in.readString(); rewrite = in.readOptionalString(); caseInsensitive = in.readBoolean(); - if (in.getTransportVersion().onOrAfter(TransportVersions.ESQL_FIXED_INDEX_LIKE)) { + if (expressionTransportSupported(in.getTransportVersion())) { forceStringMatch = in.readBoolean(); } else { forceStringMatch = false; @@ -117,11 +117,20 @@ protected void doWriteTo(StreamOutput out) throws IOException { out.writeString(value); out.writeOptionalString(rewrite); out.writeBoolean(caseInsensitive); - if (out.getTransportVersion().onOrAfter(TransportVersions.ESQL_FIXED_INDEX_LIKE)) { + if (expressionTransportSupported(out.getTransportVersion())) { out.writeBoolean(forceStringMatch); } } + /** + * Returns true if the Transport version is compatible with ESQL_FIXED_INDEX_LIKE + */ + public static boolean expressionTransportSupported(TransportVersion version) { + return version.onOrAfter(TransportVersions.ESQL_FIXED_INDEX_LIKE) + || version.isPatchFrom(TransportVersions.ESQL_FIXED_INDEX_LIKE_8_19) + || version.isPatchFrom(TransportVersions.ESQL_FIXED_INDEX_LIKE_9_1); + } + @Override public String fieldName() { return fieldName; diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/regex/WildcardLikeList.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/regex/WildcardLikeList.java index 1155589dc8ab3..d38e315b58b4f 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/regex/WildcardLikeList.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/regex/WildcardLikeList.java @@ -11,7 +11,6 @@ import org.apache.lucene.util.automaton.Automaton; import org.apache.lucene.util.automaton.CharacterRunAutomaton; import org.elasticsearch.TransportVersion; -import org.elasticsearch.TransportVersions; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; @@ -35,6 +34,8 @@ import java.util.function.Supplier; import java.util.stream.Collectors; +import static org.elasticsearch.index.query.WildcardQueryBuilder.expressionTransportSupported; + public class WildcardLikeList extends RegexMatch { public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry( Expression.class, @@ -145,7 +146,7 @@ public Query asQuery(LucenePushdownPredicates pushdownPredicates, TranslatorHand } private boolean supportsPushdown(TransportVersion version) { - return version == null || version.onOrAfter(TransportVersions.ESQL_FIXED_INDEX_LIKE); + return version == null || expressionTransportSupported(version); } @Override diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/io/stream/PlanStreamWrapperQueryBuilder.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/io/stream/PlanStreamWrapperQueryBuilder.java index bb9ca136f6d66..9cdf193c56fef 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/io/stream/PlanStreamWrapperQueryBuilder.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/io/stream/PlanStreamWrapperQueryBuilder.java @@ -20,6 +20,8 @@ import java.io.IOException; +import static org.elasticsearch.index.query.WildcardQueryBuilder.expressionTransportSupported; + /** * A {@link QueryBuilder} that wraps another {@linkplain QueryBuilder} * so it read with a {@link PlanStreamInput}. @@ -56,6 +58,11 @@ public TransportVersion getMinimalSupportedVersion() { return TransportVersions.ESQL_FIXED_INDEX_LIKE; } + @Override + public boolean supportsVersion(TransportVersion version) { + return expressionTransportSupported(version); + } + @Override public Query toQuery(SearchExecutionContext context) throws IOException { return next.toQuery(context);