Skip to content

Commit 1dde748

Browse files
committed
SQL: Improve handling of invalid args for PERCENTILE/PERCENTILE_RANK (#37803)
Improve the Exception and the error message returned when 2nd argument of PERCENTILE and PERCENTILE_RANK is not a constant.
1 parent bb5747c commit 1dde748

3 files changed

Lines changed: 10 additions & 17 deletions

File tree

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/aggregate/Percentile.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
*/
66
package org.elasticsearch.xpack.sql.expression.function.aggregate;
77

8-
import org.elasticsearch.xpack.sql.SqlIllegalArgumentException;
98
import org.elasticsearch.xpack.sql.expression.Expression;
109
import org.elasticsearch.xpack.sql.expression.Expressions;
1110
import org.elasticsearch.xpack.sql.expression.Expressions.ParamOrdinal;
@@ -17,6 +16,7 @@
1716
import java.util.List;
1817

1918
import static java.util.Collections.singletonList;
19+
import static org.elasticsearch.common.logging.LoggerMessageFormat.format;
2020

2121
public class Percentile extends NumericAggregate implements EnclosedAgg {
2222

@@ -43,8 +43,8 @@ public Percentile replaceChildren(List<Expression> newChildren) {
4343
@Override
4444
protected TypeResolution resolveType() {
4545
if (!percent.foldable()) {
46-
throw new SqlIllegalArgumentException("2nd argument of PERCENTILE must be constant, received [{}]",
47-
Expressions.name(percent));
46+
return new TypeResolution(format(null, "2nd argument of PERCENTILE must be a constant, received [{}]",
47+
Expressions.name(percent)));
4848
}
4949

5050
TypeResolution resolution = super.resolveType();

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/aggregate/PercentileRank.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
*/
66
package org.elasticsearch.xpack.sql.expression.function.aggregate;
77

8-
import org.elasticsearch.xpack.sql.SqlIllegalArgumentException;
98
import org.elasticsearch.xpack.sql.expression.Expression;
109
import org.elasticsearch.xpack.sql.expression.Expressions;
1110
import org.elasticsearch.xpack.sql.expression.Expressions.ParamOrdinal;
@@ -17,6 +16,7 @@
1716
import java.util.List;
1817

1918
import static java.util.Collections.singletonList;
19+
import static org.elasticsearch.common.logging.LoggerMessageFormat.format;
2020

2121
public class PercentileRank extends AggregateFunction implements EnclosedAgg {
2222

@@ -43,8 +43,8 @@ public Expression replaceChildren(List<Expression> newChildren) {
4343
@Override
4444
protected TypeResolution resolveType() {
4545
if (!value.foldable()) {
46-
throw new SqlIllegalArgumentException("2nd argument of PERCENTILE_RANK must be constant, received [{}]",
47-
Expressions.name(value));
46+
return new TypeResolution(format(null, "2nd argument of PERCENTILE_RANK must be a constant, received [{}]",
47+
Expressions.name(value)));
4848
}
4949

5050
TypeResolution resolution = super.resolveType();

x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/analysis/analyzer/VerifierErrorMessagesTests.java

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
package org.elasticsearch.xpack.sql.analysis.analyzer;
77

88
import org.elasticsearch.test.ESTestCase;
9-
import org.elasticsearch.xpack.sql.SqlIllegalArgumentException;
109
import org.elasticsearch.xpack.sql.TestUtils;
1110
import org.elasticsearch.xpack.sql.analysis.AnalysisException;
1211
import org.elasticsearch.xpack.sql.analysis.index.EsIndex;
@@ -539,19 +538,13 @@ public void testAggsInHistogram() {
539538
}
540539

541540
public void testErrorMessageForPercentileWithSecondArgBasedOnAField() {
542-
Analyzer analyzer = new Analyzer(TestUtils.TEST_CFG, new FunctionRegistry(), indexResolution, new Verifier(new Metrics()));
543-
SqlIllegalArgumentException e = expectThrows(SqlIllegalArgumentException.class, () -> analyzer.analyze(parser.createStatement(
544-
"SELECT PERCENTILE(int, ABS(int)) FROM test"), true));
545-
assertEquals("2nd argument of PERCENTILE must be constant, received [ABS(int)]",
546-
e.getMessage());
541+
assertEquals("1:8: 2nd argument of PERCENTILE must be a constant, received [ABS(int)]",
542+
error("SELECT PERCENTILE(int, ABS(int)) FROM test"));
547543
}
548544

549545
public void testErrorMessageForPercentileRankWithSecondArgBasedOnAField() {
550-
Analyzer analyzer = new Analyzer(TestUtils.TEST_CFG, new FunctionRegistry(), indexResolution, new Verifier(new Metrics()));
551-
SqlIllegalArgumentException e = expectThrows(SqlIllegalArgumentException.class, () -> analyzer.analyze(parser.createStatement(
552-
"SELECT PERCENTILE_RANK(int, ABS(int)) FROM test"), true));
553-
assertEquals("2nd argument of PERCENTILE_RANK must be constant, received [ABS(int)]",
554-
e.getMessage());
546+
assertEquals("1:8: 2nd argument of PERCENTILE_RANK must be a constant, received [ABS(int)]",
547+
error("SELECT PERCENTILE_RANK(int, ABS(int)) FROM test"));
555548
}
556549
}
557550

0 commit comments

Comments
 (0)