Skip to content

Commit 5ae8eac

Browse files
SQL: More friendly exceptions for validation errors (#137560)
1 parent f5cb6ea commit 5ae8eac

File tree

10 files changed

+25
-19
lines changed

10 files changed

+25
-19
lines changed

docs/changelog/137560.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 137560
2+
summary: More friendly exceptions for validation errors
3+
area: SQL
4+
type: bug
5+
issues: []

x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/expression/function/EqlFunctionRegistry.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ protected interface EqlFunctionBuilder {
9393
*/
9494
@SuppressWarnings("overloads") // These are ambiguous if you aren't using ctor references but we always do
9595
protected static FunctionDefinition def(Class<? extends Function> function, EqlFunctionBuilder builder, String... names) {
96-
Check.isTrue(names.length > 0, "At least one name must be provided for the function");
96+
Check.isTrueInternal(names.length > 0, "At least one name must be provided for the function");
9797
String primaryName = names[0];
9898
List<String> aliases = asList(names).subList(1, names.length);
9999
FunctionDefinition.Builder realBuilder = (uf, cfg, extras) -> {

x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/plan/logical/AbstractJoin.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,15 @@ static List<KeyedFilter> asKeyed(List<LogicalPlan> list) {
3131
List<KeyedFilter> keyed = new ArrayList<>(list.size());
3232

3333
for (LogicalPlan logicalPlan : list) {
34-
Check.isTrue(KeyedFilter.class.isInstance(logicalPlan), "Expected a KeyedFilter but received [{}]", logicalPlan);
34+
Check.isTrueInternal(KeyedFilter.class.isInstance(logicalPlan), "Expected a KeyedFilter but received [{}]", logicalPlan);
3535
keyed.add((KeyedFilter) logicalPlan);
3636
}
3737

3838
return keyed;
3939
}
4040

4141
static KeyedFilter asKeyed(LogicalPlan plan) {
42-
Check.isTrue(KeyedFilter.class.isInstance(plan), "Expected a KeyedFilter but received [{}]", plan);
42+
Check.isTrueInternal(KeyedFilter.class.isInstance(plan), "Expected a KeyedFilter but received [{}]", plan);
4343
return (KeyedFilter) plan;
4444
}
4545

x-pack/plugin/eql/src/test/java/org/elasticsearch/xpack/eql/planner/QueryTranslatorFailTests.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99

1010
import org.elasticsearch.xpack.eql.EqlClientException;
1111
import org.elasticsearch.xpack.eql.analysis.VerificationException;
12+
import org.elasticsearch.xpack.ql.InvalidArgumentException;
1213
import org.elasticsearch.xpack.ql.ParsingException;
13-
import org.elasticsearch.xpack.ql.QlIllegalArgumentException;
1414

1515
import static org.hamcrest.Matchers.endsWith;
1616
import static org.hamcrest.Matchers.startsWith;
@@ -189,8 +189,8 @@ public void testNumberFunctionNonString() {
189189
}
190190

191191
public void testPropertyEquationFilterUnsupported() {
192-
QlIllegalArgumentException e = expectThrows(
193-
QlIllegalArgumentException.class,
192+
InvalidArgumentException e = expectThrows(
193+
InvalidArgumentException.class,
194194
() -> plan("process where (serial_event_id<9 and serial_event_id >= 7) or (opcode == pid)")
195195
);
196196
String msg = e.getMessage();

x-pack/plugin/ql/src/main/java/org/elasticsearch/xpack/ql/expression/function/FunctionRegistry.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ protected interface FunctionBuilder {
156156
*/
157157
@SuppressWarnings("overloads")
158158
protected static FunctionDefinition def(Class<? extends Function> function, FunctionBuilder builder, String... names) {
159-
Check.isTrue(names.length > 0, "At least one name must be provided for the function");
159+
Check.isTrueInternal(names.length > 0, "At least one name must be provided for the function");
160160
String primaryName = names[0];
161161
List<String> aliases = Arrays.asList(names).subList(1, names.length);
162162
FunctionDefinition.Builder realBuilder = (uf, cfg, extras) -> {

x-pack/plugin/ql/src/main/java/org/elasticsearch/xpack/ql/expression/function/aggregate/InnerAggregate.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ public InnerAggregate(Source source, AggregateFunction inner, CompoundAggregate
3131
super(source, outer.field(), outer.parameters());
3232
this.inner = inner;
3333
this.outer = outer;
34-
Check.isTrue(inner instanceof EnclosedAgg, "Inner function is not marked as Enclosed");
35-
Check.isTrue(outer instanceof Expression, "CompoundAggregate is not an Expression");
34+
Check.isTrueInternal(inner instanceof EnclosedAgg, "Inner function is not marked as Enclosed");
35+
Check.isTrueInternal(outer instanceof Expression, "CompoundAggregate is not an Expression");
3636
this.innerName = ((EnclosedAgg) inner).innerName();
3737
this.innerKey = innerKey;
3838
}

x-pack/plugin/ql/src/main/java/org/elasticsearch/xpack/ql/type/Schema.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public DataType type() {
5252
private final List<DataType> types;
5353

5454
public Schema(List<String> names, List<DataType> types) {
55-
Check.isTrue(names.size() == types.size(), "Different # of names {} vs types {}", names, types);
55+
Check.isTrueInternal(names.size() == types.size(), "Different # of names {} vs types {}", names, types);
5656
this.types = types;
5757
this.names = names;
5858
}

x-pack/plugin/ql/src/main/java/org/elasticsearch/xpack/ql/util/Check.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,34 +6,35 @@
66
*/
77
package org.elasticsearch.xpack.ql.util;
88

9+
import org.elasticsearch.xpack.ql.InvalidArgumentException;
910
import org.elasticsearch.xpack.ql.QlIllegalArgumentException;
1011

1112
/**
1213
* Utility class used for checking various conditions at runtime, with minimum amount of code.
1314
*/
1415
public abstract class Check {
1516

16-
public static void isTrue(boolean expression, String message, Object... values) {
17+
public static void isTrueInternal(boolean expression, String message, Object... values) {
1718
if (expression == false) {
1819
throw new QlIllegalArgumentException(message, values);
1920
}
2021
}
2122

22-
public static void isTrue(boolean expression, String message) {
23+
public static void isTrue(boolean expression, String message, Object... values) {
2324
if (expression == false) {
24-
throw new QlIllegalArgumentException(message);
25+
throw new InvalidArgumentException(message, values);
2526
}
2627
}
2728

28-
public static void notNull(Object object, String message) {
29+
public static void notNullInternal(Object object, String message, Object... values) {
2930
if (object == null) {
30-
throw new QlIllegalArgumentException(message);
31+
throw new QlIllegalArgumentException(message, values);
3132
}
3233
}
3334

3435
public static void notNull(Object object, String message, Object... values) {
3536
if (object == null) {
36-
throw new QlIllegalArgumentException(message, values);
37+
throw new InvalidArgumentException(message, values);
3738
}
3839
}
3940

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ protected static FunctionDefinition def(
306306
boolean datetime,
307307
String... names
308308
) {
309-
Check.isTrue(names.length > 0, "At least one name must be provided for the function");
309+
Check.isTrueInternal(names.length > 0, "At least one name must be provided for the function");
310310
String primaryName = names[0];
311311
List<String> aliases = Arrays.asList(names).subList(1, names.length);
312312
FunctionDefinition.Builder realBuilder = (uf, cfg, extras) -> {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import org.elasticsearch.search.aggregations.metrics.PercentilesAggregationBuilder;
2020
import org.elasticsearch.search.aggregations.metrics.PercentilesConfig;
2121
import org.elasticsearch.test.ESTestCase;
22-
import org.elasticsearch.xpack.ql.QlIllegalArgumentException;
22+
import org.elasticsearch.xpack.ql.InvalidArgumentException;
2323
import org.elasticsearch.xpack.ql.execution.search.FieldExtraction;
2424
import org.elasticsearch.xpack.ql.expression.Alias;
2525
import org.elasticsearch.xpack.ql.expression.Attribute;
@@ -246,7 +246,7 @@ public void testComparisonAgainstColumns() {
246246
p = ((Project) p).child();
247247
assertTrue(p instanceof Filter);
248248
Expression condition = ((Filter) p).condition();
249-
QlIllegalArgumentException ex = expectThrows(QlIllegalArgumentException.class, () -> translate(condition));
249+
InvalidArgumentException ex = expectThrows(InvalidArgumentException.class, () -> translate(condition));
250250
assertEquals("Line 1:43: Comparisons against fields are not (currently) supported; offender [int] in [>]", ex.getMessage());
251251
}
252252

0 commit comments

Comments
 (0)