Browse Source

ESQL: mark LOOKUP JOIN as ExecutesOn.Any by default (#133064)

Alexander Spies 1 month ago
parent
commit
5e43ea5e29

+ 5 - 0
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: []

+ 1 - 1
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/join/Join.java

@@ -318,7 +318,7 @@ public class Join extends BinaryPlan implements PostAnalysisVerificationAware, S
 
     @Override
     public ExecuteLocation executesOn() {
-        return isRemote ? ExecuteLocation.REMOTE : ExecuteLocation.COORDINATOR;
+        return isRemote ? ExecuteLocation.REMOTE : ExecuteLocation.ANY;
     }
 
     private void checkRemoteJoin(Failures failures) {

+ 37 - 6
x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/OptimizerVerificationTests.java

@@ -95,16 +95,40 @@ public class OptimizerVerificationTests extends AbstractLogicalPlanOptimizerTest
 
         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
@@ -118,6 +142,13 @@ public class OptimizerVerificationTests extends AbstractLogicalPlanOptimizerTest
             | 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
@@ -230,6 +261,9 @@ public class OptimizerVerificationTests extends AbstractLogicalPlanOptimizerTest
         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(
@@ -257,24 +291,22 @@ public class OptimizerVerificationTests extends AbstractLogicalPlanOptimizerTest
             | %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
@@ -282,7 +314,6 @@ public class OptimizerVerificationTests extends AbstractLogicalPlanOptimizerTest
             | 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() {