Skip to content

Commit e4b6eb4

Browse files
committed
SQL: Fix translation of math functions to painless (#35910)
`SIGN` and `RADIANS` where wrongly overriding `mathFunction()`. Converted `mathFunction()` to private in `MathFunction` since it shouldn't be overriden, as it uses the assigned `MathOperation` to get the funtion name for painless scripts. Fixes: #35654
1 parent 63cc008 commit e4b6eb4

File tree

4 files changed

+27
-15
lines changed

4 files changed

+27
-15
lines changed

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/MathFunction.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,8 @@ public Object fold() {
4141

4242
@Override
4343
public String processScript(String template) {
44-
return super.processScript(format(Locale.ROOT, "{sql}.%s(%s)", mathFunction(), template));
45-
}
46-
47-
protected String mathFunction() {
48-
return getClass().getSimpleName().toLowerCase(Locale.ROOT);
44+
return super.processScript(format(
45+
Locale.ROOT, "{sql}.%s(%s)", getClass().getSimpleName().toLowerCase(Locale.ROOT), template));
4946
}
5047

5148
@Override

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Radians.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,6 @@ protected Radians replaceChild(Expression newChild) {
2929
return new Radians(location(), newChild);
3030
}
3131

32-
@Override
33-
protected String mathFunction() {
34-
return "toRadians";
35-
}
36-
3732
@Override
3833
protected MathOperation operation() {
3934
return MathOperation.RADIANS;

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/math/Sign.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,6 @@ protected Sign replaceChild(Expression newChild) {
3434
return new Sign(location(), newChild);
3535
}
3636

37-
@Override
38-
protected String mathFunction() {
39-
return "signum";
40-
}
41-
4237
@Override
4338
protected MathOperation operation() {
4439
return MathOperation.SIGN;

x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/planner/QueryTranslatorTests.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.elasticsearch.xpack.sql.analysis.index.MappingException;
1414
import org.elasticsearch.xpack.sql.expression.Expression;
1515
import org.elasticsearch.xpack.sql.expression.function.FunctionRegistry;
16+
import org.elasticsearch.xpack.sql.expression.function.scalar.math.MathProcessor.MathOperation;
1617
import org.elasticsearch.xpack.sql.parser.SqlParser;
1718
import org.elasticsearch.xpack.sql.plan.logical.Filter;
1819
import org.elasticsearch.xpack.sql.plan.logical.LogicalPlan;
@@ -32,9 +33,13 @@
3233
import org.junit.AfterClass;
3334
import org.junit.BeforeClass;
3435

36+
import java.util.Locale;
3537
import java.util.Map;
3638
import java.util.TimeZone;
39+
import java.util.stream.Stream;
3740

41+
import static org.elasticsearch.xpack.sql.expression.function.scalar.math.MathProcessor.MathOperation.E;
42+
import static org.elasticsearch.xpack.sql.expression.function.scalar.math.MathProcessor.MathOperation.PI;
3843
import static org.hamcrest.Matchers.endsWith;
3944
import static org.hamcrest.Matchers.startsWith;
4045

@@ -365,4 +370,24 @@ public void testTranslateInExpression_HavingClause_PainlessAndNullHandling() {
365370
assertThat(aggFilter.scriptTemplate().params().toString(), startsWith("[{a=MAX(int){a->"));
366371
assertThat(aggFilter.scriptTemplate().params().toString(), endsWith(", {v=[10, null, 20, 30]}]"));
367372
}
373+
374+
public void testTranslateMathFunction_HavingClause_Painless() {
375+
MathOperation operation =
376+
(MathOperation) randomFrom(Stream.of(MathOperation.values()).filter(o -> o != PI && o != E).toArray());
377+
378+
LogicalPlan p = plan("SELECT keyword, max(int) FROM test GROUP BY keyword HAVING " +
379+
operation.name() + "(max(int)) > 10");
380+
assertTrue(p instanceof Project);
381+
assertTrue(p.children().get(0) instanceof Filter);
382+
Expression condition = ((Filter) p.children().get(0)).condition();
383+
assertFalse(condition.foldable());
384+
QueryTranslation translation = QueryTranslator.toQuery(condition, true);
385+
assertNull(translation.query);
386+
AggFilter aggFilter = translation.aggFilter;
387+
assertEquals("InternalSqlScriptUtils.nullSafeFilter(InternalSqlScriptUtils.gt(InternalSqlScriptUtils." +
388+
operation.name().toLowerCase(Locale.ROOT) + "(params.a0),params.v0))",
389+
aggFilter.scriptTemplate().toString());
390+
assertThat(aggFilter.scriptTemplate().params().toString(), startsWith("[{a=MAX(int){a->"));
391+
assertThat(aggFilter.scriptTemplate().params().toString(), endsWith(", {v=10}]"));
392+
}
368393
}

0 commit comments

Comments
 (0)