5353import static org .elasticsearch .xpack .esql .EsqlTestUtils .testAnalyzerContext ;
5454import static org .elasticsearch .xpack .esql .EsqlTestUtils .withDefaultLimitWarning ;
5555import static org .elasticsearch .xpack .esql .analysis .Analyzer .ESQL_LOOKUP_JOIN_FULL_TEXT_FUNCTION ;
56+ import static org .elasticsearch .xpack .esql .analysis .Analyzer .ESQL_LOOKUP_JOIN_GENERAL_EXPRESSION ;
5657import static org .elasticsearch .xpack .esql .analysis .AnalyzerTestUtils .TEXT_EMBEDDING_INFERENCE_ID ;
5758import static org .elasticsearch .xpack .esql .analysis .AnalyzerTestUtils .defaultLookupResolution ;
5859import static org .elasticsearch .xpack .esql .analysis .AnalyzerTestUtils .loadMapping ;
@@ -2340,7 +2341,10 @@ public void testLookupJoinDataTypeMismatch() {
23402341
23412342 assertEquals (
23422343 "1:87: JOIN left field [language_code] of type [KEYWORD] is incompatible with right field [language_code] of type [INTEGER]" ,
2343- error ("FROM test | EVAL language_code = languages::keyword | LOOKUP JOIN languages_lookup ON language_code" )
2344+ error (
2345+ "FROM test | EVAL language_code = languages::keyword | LOOKUP JOIN languages_lookup ON language_code" ,
2346+ ESQL_LOOKUP_JOIN_GENERAL_EXPRESSION
2347+ )
23442348 );
23452349 }
23462350
@@ -2364,66 +2368,59 @@ public void testLookupJoinExpressionAmbiguousRight() {
23642368 public void testLookupJoinExpressionRightNotPushable () {
23652369 assumeTrue (
23662370 "requires LOOKUP JOIN ON boolean expression capability" ,
2367- EsqlCapabilities .Cap .LOOKUP_JOIN_WITH_FULL_TEXT_FUNCTION .isEnabled ()
2371+ EsqlCapabilities .Cap .LOOKUP_JOIN_WITH_GENERAL_EXPRESSION .isEnabled ()
23682372 );
23692373 String queryString = """
23702374 from test
23712375 | rename languages as languages_left
23722376 | lookup join languages_lookup ON languages_left == language_code and abs(salary) > 1000
23732377 """ ;
23742378
2375- assertEquals (
2376- "3:71: Unsupported join filter expression:abs(salary) > 1000" ,
2377- error (queryString , ESQL_LOOKUP_JOIN_FULL_TEXT_FUNCTION )
2378- );
2379+ query (queryString , ESQL_LOOKUP_JOIN_GENERAL_EXPRESSION );
23792380 }
23802381
23812382 public void testLookupJoinExpressionConstant () {
23822383 assumeTrue (
23832384 "requires LOOKUP JOIN ON boolean expression capability" ,
2384- EsqlCapabilities .Cap .LOOKUP_JOIN_WITH_FULL_TEXT_FUNCTION .isEnabled ()
2385+ EsqlCapabilities .Cap .LOOKUP_JOIN_WITH_GENERAL_EXPRESSION .isEnabled ()
23852386 );
23862387 String queryString = """
23872388 from test
23882389 | rename languages as languages_left
23892390 | lookup join languages_lookup ON false and languages_left == language_code
23902391 """ ;
23912392
2392- assertEquals ( "3:35: Unsupported join filter expression:false" , error ( queryString , ESQL_LOOKUP_JOIN_FULL_TEXT_FUNCTION ) );
2393+ query ( queryString , ESQL_LOOKUP_JOIN_GENERAL_EXPRESSION );
23932394 }
23942395
23952396 public void testLookupJoinExpressionTranslatableButFromLeft () {
23962397 assumeTrue (
23972398 "requires LOOKUP JOIN ON boolean expression capability" ,
2398- EsqlCapabilities .Cap .LOOKUP_JOIN_WITH_FULL_TEXT_FUNCTION .isEnabled ()
2399+ EsqlCapabilities .Cap .LOOKUP_JOIN_WITH_GENERAL_EXPRESSION .isEnabled ()
23992400 );
24002401 String queryString = """
24012402 from test
24022403 | rename languages as languages_left
2403- | lookup join languages_lookup ON languages_left == language_code and languages_left == "English"
2404+ | eval languages_left_str = to_string(languages_left)
2405+ | lookup join languages_lookup ON languages_left == language_code and languages_left_str == language_name
24042406 """ ;
24052407
2406- assertEquals (
2407- "3:71: Unsupported join filter expression:languages_left == \" English\" " ,
2408- error (queryString , ESQL_LOOKUP_JOIN_FULL_TEXT_FUNCTION )
2409- );
2408+ query (queryString , ESQL_LOOKUP_JOIN_GENERAL_EXPRESSION );
24102409 }
24112410
24122411 public void testLookupJoinExpressionTranslatableButMixedLeftRight () {
24132412 assumeTrue (
24142413 "requires LOOKUP JOIN ON boolean expression capability" ,
2415- EsqlCapabilities .Cap .LOOKUP_JOIN_WITH_FULL_TEXT_FUNCTION .isEnabled ()
2414+ EsqlCapabilities .Cap .LOOKUP_JOIN_WITH_GENERAL_EXPRESSION .isEnabled ()
24162415 );
24172416 String queryString = """
24182417 from test
24192418 | rename languages as languages_left
2420- | lookup join languages_lookup ON languages_left == language_code and CONCAT(languages_left, language_code) == "English"
2419+ | eval language_name_left = "English"
2420+ | lookup join languages_lookup ON languages_left == language_code and CONCAT(language_name_left, language_name) == "English"
24212421 """ ;
24222422
2423- assertEquals (
2424- "3:71: Unsupported join filter expression:CONCAT(languages_left, language_code) == \" English\" " ,
2425- error (queryString , ESQL_LOOKUP_JOIN_FULL_TEXT_FUNCTION )
2426- );
2423+ query (queryString , ESQL_LOOKUP_JOIN_GENERAL_EXPRESSION );
24272424 }
24282425
24292426 public void testLookupJoinExpressionComplexFormula () {
@@ -2434,13 +2431,11 @@ public void testLookupJoinExpressionComplexFormula() {
24342431 String queryString = """
24352432 from test
24362433 | rename languages as languages_left
2437- | lookup join languages_lookup ON languages_left == language_code AND STARTSWITH(languages_left, language_code)
2434+ | eval languages_left_str = to_string(languages_left)
2435+ | lookup join languages_lookup ON languages_left == language_code AND starts_with(languages_left_str, language_name)
24382436 """ ;
24392437
2440- assertEquals (
2441- "3:71: Unsupported join filter expression:STARTSWITH(languages_left, language_code)" ,
2442- error (queryString , ESQL_LOOKUP_JOIN_FULL_TEXT_FUNCTION )
2443- );
2438+ query (queryString , ESQL_LOOKUP_JOIN_GENERAL_EXPRESSION );
24442439 }
24452440
24462441 public void testLookupJoinExpressionAmbiguousLeft () {
@@ -3348,6 +3343,13 @@ private void query(String query, Analyzer analyzer) {
33483343 analyzer .analyze (parser .createStatement (query ));
33493344 }
33503345
3346+ private void query (String query , TransportVersion transportVersion ) {
3347+ MutableAnalyzerContext mutableContext = (MutableAnalyzerContext ) defaultAnalyzer .context ();
3348+ try (var restore = mutableContext .setTemporaryTransportVersionOnOrAfter (transportVersion )) {
3349+ query (query );
3350+ }
3351+ }
3352+
33513353 private String error (String query ) {
33523354 return error (query , defaultAnalyzer );
33533355 }
0 commit comments