diff --git a/docs/changelog/133064.yaml b/docs/changelog/133064.yaml new file mode 100644 index 0000000000000..599857ca00534 --- /dev/null +++ b/docs/changelog/133064.yaml @@ -0,0 +1,5 @@ +pr: 133064 +summary: Mark LOOKUP JOIN as `ExecutesOn.Any` by default +area: ES|QL +type: bug +issues: [] diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/join/Join.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/join/Join.java index 2f217df1468a6..30d67ab2cbd73 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/join/Join.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/join/Join.java @@ -318,7 +318,7 @@ public boolean isRemote() { @Override public ExecuteLocation executesOn() { - return isRemote ? ExecuteLocation.REMOTE : ExecuteLocation.COORDINATOR; + return isRemote ? ExecuteLocation.REMOTE : ExecuteLocation.ANY; } private void checkRemoteJoin(Failures failures) { diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/OptimizerVerificationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/OptimizerVerificationTests.java index fcfe4a0a2a455..10e7da2c915db 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/OptimizerVerificationTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/OptimizerVerificationTests.java @@ -94,16 +94,40 @@ public void testRemoteEnrichAfterCoordinatorOnlyPlans() { String err; + // Remote enrich is ok after limit plan(""" FROM test + | LIMIT 10 | EVAL language_code = languages | ENRICH _remote:languages ON language_code | STATS count(*) BY language_name """, analyzer); + // Remote enrich is ok after topn + plan(""" + FROM test + | EVAL language_code = languages + | SORT languages + | ENRICH _remote:languages ON language_code + """, analyzer); + plan(""" + FROM test + | EVAL language_code = languages + | SORT languages + | LIMIT 2 + | ENRICH _remote:languages ON language_code + """, analyzer); + + // Remote enrich is ok before pipeline breakers plan(""" FROM test + | EVAL language_code = languages + | ENRICH _remote:languages ON language_code | LIMIT 10 + """, analyzer); + + plan(""" + FROM test | EVAL language_code = languages | ENRICH _remote:languages ON language_code | STATS count(*) BY language_name @@ -117,6 +141,13 @@ public void testRemoteEnrichAfterCoordinatorOnlyPlans() { | LIMIT 10 """, analyzer); + plan(""" + FROM test + | EVAL language_code = languages + | ENRICH _remote:languages ON language_code + | SORT language_name + """, analyzer); + err = error(""" FROM test | EVAL language_code = languages @@ -227,6 +258,9 @@ public void testRemoteEnrichAfterCoordinatorOnlyPlans() { assertThat(err, containsString("4:3: ENRICH with remote policy can't be executed after [CHANGE_POINT salary ON languages]@2:3")); } + /** + * The validation should not trigger for remote enrich after a lookup join. Lookup joins can be executed anywhere. + */ public void testRemoteEnrichAfterLookupJoin() { EnrichResolution enrichResolution = new EnrichResolution(); loadEnrichPolicyResolution( @@ -254,24 +288,22 @@ public void testRemoteEnrichAfterLookupJoin() { | %s """, lookupCommand), analyzer); - String err = error(Strings.format(""" + plan(Strings.format(""" FROM test | EVAL language_code = languages | %s | ENRICH _remote:languages ON language_code """, lookupCommand), analyzer); - assertThat(err, containsString("4:3: ENRICH with remote policy can't be executed after [" + lookupCommand + "]@3:3")); - err = error(Strings.format(""" + plan(Strings.format(""" FROM test | EVAL language_code = languages | %s | ENRICH _remote:languages ON language_code | %s """, lookupCommand, lookupCommand), analyzer); - assertThat(err, containsString("4:3: ENRICH with remote policy can't be executed after [" + lookupCommand + "]@3:3")); - err = error(Strings.format(""" + plan(Strings.format(""" FROM test | EVAL language_code = languages | %s @@ -279,7 +311,6 @@ public void testRemoteEnrichAfterLookupJoin() { | MV_EXPAND language_code | ENRICH _remote:languages ON language_code """, lookupCommand), analyzer); - assertThat(err, containsString("6:3: ENRICH with remote policy can't be executed after [" + lookupCommand + "]@3:3")); } public void testRemoteLookupJoinWithPipelineBreaker() {