|  | @@ -1863,6 +1863,121 @@ public class IndexResolverFieldNamesTests extends ESTestCase {
 | 
	
		
			
				|  |  |          );
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    public void testForkFieldsWithKeepAfterFork() {
 | 
	
		
			
				|  |  | +        assumeTrue("FORK available as snapshot only", EsqlCapabilities.Cap.FORK.isEnabled());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        assertFieldNames("""
 | 
	
		
			
				|  |  | +            FROM test
 | 
	
		
			
				|  |  | +            | WHERE a > 2000
 | 
	
		
			
				|  |  | +            | EVAL b = a + 100
 | 
	
		
			
				|  |  | +            | FORK (WHERE c > 1 AND a < 10000 | EVAL d = a + 500)
 | 
	
		
			
				|  |  | +                   (WHERE d > 1000 AND e == "aaa" | EVAL c = a + 200)
 | 
	
		
			
				|  |  | +            | WHERE x > y
 | 
	
		
			
				|  |  | +            | KEEP a, b, c, d, x
 | 
	
		
			
				|  |  | +            """, Set.of("a", "a.*", "c", "c.*", "d", "d.*", "e", "e.*", "x", "x.*", "y", "y.*"));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void testForkFieldsWithKeepBeforeFork() {
 | 
	
		
			
				|  |  | +        assumeTrue("FORK available as snapshot only", EsqlCapabilities.Cap.FORK.isEnabled());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        assertFieldNames("""
 | 
	
		
			
				|  |  | +            FROM test
 | 
	
		
			
				|  |  | +            | KEEP a, b, c, d, x
 | 
	
		
			
				|  |  | +            | WHERE a > 2000
 | 
	
		
			
				|  |  | +            | EVAL b = a + 100
 | 
	
		
			
				|  |  | +            | FORK (WHERE c > 1 AND a < 10000 | EVAL d = a + 500)
 | 
	
		
			
				|  |  | +                   (WHERE d > 1000 AND e == "aaa" | EVAL c = a + 200)
 | 
	
		
			
				|  |  | +            | WHERE x > y
 | 
	
		
			
				|  |  | +            """, Set.of("a", "a.*", "b", "b.*", "c", "c.*", "d", "d.*", "e", "e.*", "x", "x.*", "y", "y.*"));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void testForkFieldsWithNoProjection() {
 | 
	
		
			
				|  |  | +        assumeTrue("FORK available as snapshot only", EsqlCapabilities.Cap.FORK.isEnabled());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        assertFieldNames("""
 | 
	
		
			
				|  |  | +            FROM test
 | 
	
		
			
				|  |  | +            | WHERE a > 2000
 | 
	
		
			
				|  |  | +            | EVAL b = a + 100
 | 
	
		
			
				|  |  | +            | FORK (WHERE c > 1 AND a < 10000 | EVAL d = a + 500)
 | 
	
		
			
				|  |  | +                   (WHERE d > 1000 AND e == "aaa" | EVAL c = a + 200)
 | 
	
		
			
				|  |  | +            | WHERE x > y
 | 
	
		
			
				|  |  | +            """, ALL_FIELDS);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void testForkFieldsWithStatsInOneBranch() {
 | 
	
		
			
				|  |  | +        assumeTrue("FORK available as snapshot only", EsqlCapabilities.Cap.FORK.isEnabled());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        assertFieldNames("""
 | 
	
		
			
				|  |  | +            FROM test
 | 
	
		
			
				|  |  | +            | WHERE a > 2000
 | 
	
		
			
				|  |  | +            | EVAL b = a + 100
 | 
	
		
			
				|  |  | +            | FORK (WHERE c > 1 AND a < 10000 | EVAL d = a + 500)
 | 
	
		
			
				|  |  | +                   (STATS x = count(*), y=min(z))
 | 
	
		
			
				|  |  | +            | WHERE x > y
 | 
	
		
			
				|  |  | +            """, ALL_FIELDS);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void testForkFieldsWithEnrichAndLookupJoins() {
 | 
	
		
			
				|  |  | +        assumeTrue("FORK available as snapshot only", EsqlCapabilities.Cap.FORK.isEnabled());
 | 
	
		
			
				|  |  | +        assumeTrue("LOOKUP JOIN available as snapshot only", EsqlCapabilities.Cap.JOIN_LOOKUP_V12.isEnabled());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        assertFieldNames(
 | 
	
		
			
				|  |  | +            """
 | 
	
		
			
				|  |  | +                FROM test
 | 
	
		
			
				|  |  | +                | KEEP a, b, abc, def, z, xyz
 | 
	
		
			
				|  |  | +                | ENRICH enrich_policy ON abc
 | 
	
		
			
				|  |  | +                | EVAL b = a + 100
 | 
	
		
			
				|  |  | +                | LOOKUP JOIN my_lookup_index ON def
 | 
	
		
			
				|  |  | +                | FORK (WHERE c > 1 AND a < 10000 | EVAL d = a + 500)
 | 
	
		
			
				|  |  | +                       (STATS x = count(*), y=min(z))
 | 
	
		
			
				|  |  | +                | LOOKUP JOIN my_lookup_index ON xyz
 | 
	
		
			
				|  |  | +                | WHERE x > y OR _fork == "fork1"
 | 
	
		
			
				|  |  | +                """,
 | 
	
		
			
				|  |  | +            Set.of(
 | 
	
		
			
				|  |  | +                "x",
 | 
	
		
			
				|  |  | +                "y",
 | 
	
		
			
				|  |  | +                "_fork",
 | 
	
		
			
				|  |  | +                "a",
 | 
	
		
			
				|  |  | +                "c",
 | 
	
		
			
				|  |  | +                "abc",
 | 
	
		
			
				|  |  | +                "b",
 | 
	
		
			
				|  |  | +                "def",
 | 
	
		
			
				|  |  | +                "z",
 | 
	
		
			
				|  |  | +                "xyz",
 | 
	
		
			
				|  |  | +                "def.*",
 | 
	
		
			
				|  |  | +                "_fork.*",
 | 
	
		
			
				|  |  | +                "y.*",
 | 
	
		
			
				|  |  | +                "x.*",
 | 
	
		
			
				|  |  | +                "xyz.*",
 | 
	
		
			
				|  |  | +                "z.*",
 | 
	
		
			
				|  |  | +                "abc.*",
 | 
	
		
			
				|  |  | +                "a.*",
 | 
	
		
			
				|  |  | +                "c.*",
 | 
	
		
			
				|  |  | +                "b.*"
 | 
	
		
			
				|  |  | +            )
 | 
	
		
			
				|  |  | +        );
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void testForkWithStatsInAllBranches() {
 | 
	
		
			
				|  |  | +        assumeTrue("FORK available as snapshot only", EsqlCapabilities.Cap.FORK.isEnabled());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        assertFieldNames("""
 | 
	
		
			
				|  |  | +            FROM test
 | 
	
		
			
				|  |  | +            | WHERE a > 2000
 | 
	
		
			
				|  |  | +            | EVAL b = a + 100
 | 
	
		
			
				|  |  | +            | FORK (WHERE c > 1 AND a < 10000 | STATS m = count(*))
 | 
	
		
			
				|  |  | +                   (EVAL z = a * b | STATS m = max(z))
 | 
	
		
			
				|  |  | +                   (STATS x = count(*), y=min(z))
 | 
	
		
			
				|  |  | +            | WHERE x > y
 | 
	
		
			
				|  |  | +            """, Set.of("a", "a.*", "b", "b.*", "c", "c.*", "z", "z.*"));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void testForkWithStatsAndWhere() {
 | 
	
		
			
				|  |  | +        assumeTrue("FORK available as snapshot only", EsqlCapabilities.Cap.FORK.isEnabled());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        assertFieldNames(" FROM employees | FORK ( WHERE true | stats min(salary) by gender) ( WHERE true | LIMIT 3 )", ALL_FIELDS);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      private Set<String> fieldNames(String query, Set<String> enrichPolicyMatchFields) {
 | 
	
		
			
				|  |  |          var preAnalysisResult = new EsqlSession.PreAnalysisResult(null);
 | 
	
		
			
				|  |  |          return EsqlSession.fieldNames(parser.createStatement(query), enrichPolicyMatchFields, preAnalysisResult).fieldNames();
 |