From 3796a14566122b66b0fbf35232c69a205a4bd2f0 Mon Sep 17 00:00:00 2001 From: Alexander Spies Date: Mon, 18 Aug 2025 12:03:21 +0200 Subject: [PATCH 1/4] LOOKUP JOIN can run anywhere by default --- .../org/elasticsearch/xpack/esql/plan/logical/join/Join.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) { From ce76fba29aa2f0e03f2283955556ce3c3e759672 Mon Sep 17 00:00:00 2001 From: Alexander Spies Date: Mon, 18 Aug 2025 12:23:21 +0200 Subject: [PATCH 2/4] Update validation tests --- .../optimizer/OptimizerVerificationTests.java | 44 ++++++++++++++++--- 1 file changed, 38 insertions(+), 6 deletions(-) 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..6f8be5b2dc67c 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,41 @@ 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 +142,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 +259,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 +289,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 +312,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() { From 7e6898949aee8fc7d51f05d5a4fb810349bac9f8 Mon Sep 17 00:00:00 2001 From: Alexander Spies Date: Mon, 18 Aug 2025 12:26:27 +0200 Subject: [PATCH 3/4] Update docs/changelog/133064.yaml --- docs/changelog/133064.yaml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/changelog/133064.yaml 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: [] From 2e4f56c600045e16a4796edbe1ec2bb1259edae0 Mon Sep 17 00:00:00 2001 From: elasticsearchmachine Date: Mon, 18 Aug 2025 10:32:35 +0000 Subject: [PATCH 4/4] [CI] Auto commit changes from spotless --- .../xpack/esql/optimizer/OptimizerVerificationTests.java | 1 - 1 file changed, 1 deletion(-) 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 6f8be5b2dc67c..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,7 +94,6 @@ public void testRemoteEnrichAfterCoordinatorOnlyPlans() { String err; - // Remote enrich is ok after limit plan(""" FROM test