Skip to content

Commit 54c789d

Browse files
[ES|QL] Prevent using unnamed fields in the RERANK command (#127416)
1 parent 061a751 commit 54c789d

File tree

13 files changed

+1583
-1315
lines changed

13 files changed

+1583
-1315
lines changed

x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,14 @@ field
8787
: (qualifiedName ASSIGN)? booleanExpression
8888
;
8989

90+
rerankFields
91+
: rerankField (COMMA rerankField)*
92+
;
93+
94+
rerankField
95+
: qualifiedName (ASSIGN booleanExpression)?
96+
;
97+
9098
fromCommand
9199
: FROM indexPatternAndMetadataFields
92100
;
@@ -296,7 +304,7 @@ rrfCommand
296304
;
297305

298306
rerankCommand
299-
: DEV_RERANK queryText=constant ON fields WITH inferenceId=identifierOrParameter
307+
: DEV_RERANK queryText=constant ON rerankFields WITH inferenceId=identifierOrParameter
300308
;
301309

302310
completionCommand

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java

Lines changed: 1290 additions & 1145 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/ExpressionBuilder.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -826,6 +826,25 @@ public List<Alias> visitFields(EsqlBaseParser.FieldsContext ctx) {
826826
return ctx != null ? visitList(this, ctx.field(), Alias.class) : new ArrayList<>();
827827
}
828828

829+
@Override
830+
public Alias visitRerankField(EsqlBaseParser.RerankFieldContext ctx) {
831+
return visitRerankField(ctx, source(ctx));
832+
}
833+
834+
private Alias visitRerankField(EsqlBaseParser.RerankFieldContext ctx, Source source) {
835+
UnresolvedAttribute id = visitQualifiedName(ctx.qualifiedName());
836+
assert id != null;
837+
838+
var boolExprCtx = ctx.booleanExpression();
839+
Expression value = boolExprCtx == null ? id : expression(boolExprCtx);
840+
return new Alias(source, id.name(), value);
841+
}
842+
843+
@Override
844+
public List<Alias> visitRerankFields(EsqlBaseParser.RerankFieldsContext ctx) {
845+
return ctx != null ? visitList(this, ctx.rerankField(), Alias.class) : new ArrayList<>();
846+
}
847+
829848
@Override
830849
public NamedExpression visitAggField(EsqlBaseParser.AggFieldContext ctx) {
831850
Source source = source(ctx);

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/LogicalPlanBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -731,7 +731,7 @@ public PlanFactory visitRerankCommand(EsqlBaseParser.RerankCommandContext ctx) {
731731
);
732732
}
733733

734-
return p -> new Rerank(source, p, inferenceId(ctx.inferenceId), queryText, visitFields(ctx.fields()));
734+
return p -> new Rerank(source, p, inferenceId(ctx.inferenceId), queryText, visitRerankFields(ctx.rerankFields()));
735735
}
736736

737737
@Override

x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/AnalyzerTests.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3613,6 +3613,19 @@ public void testResolveRerankFields() {
36133613
assertThat(rerank.scoreAttribute(), equalTo(getAttributeByName(relation.output(), MetadataAttribute.SCORE)));
36143614
}
36153615

3616+
{
3617+
// Unnamed field.
3618+
try {
3619+
LogicalPlan plan = analyze("""
3620+
FROM books METADATA _score
3621+
| WHERE title:"food"
3622+
| RERANK "food" ON title, SUBSTRING(description, 0, 100), yearRenamed=year WITH `reranking-inference-id`
3623+
""", "mapping-books.json");
3624+
} catch (ParsingException ex) {
3625+
assertThat(ex.getMessage(), containsString("line 3:36: mismatched input '(' expecting {'=', ',', '.', 'with'}"));
3626+
}
3627+
}
3628+
36163629
{
36173630
VerificationException ve = expectThrows(
36183631
VerificationException.class,

0 commit comments

Comments
 (0)