Skip to content

Commit 479cc16

Browse files
author
Andras Palinkas
authored
SQL: Test IN operator out of range validation (#64546)
Additional tests. Test if the type of the field is actually picked up from the field mapping and if the values specified for the `IN` operator are converter to the type of the field (for numerical fields). Relates to #64238
1 parent 79c267f commit 479cc16

File tree

1 file changed

+64
-24
lines changed

1 file changed

+64
-24
lines changed

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

Lines changed: 64 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -99,48 +99,76 @@
9999
import static org.elasticsearch.xpack.sql.planner.QueryTranslator.DATE_FORMAT;
100100
import static org.elasticsearch.xpack.sql.planner.QueryTranslator.TIME_FORMAT;
101101
import static org.elasticsearch.xpack.sql.type.SqlDataTypes.DATE;
102-
import static org.elasticsearch.xpack.sql.util.DateUtils.UTC;
103102
import static org.hamcrest.CoreMatchers.containsString;
104103
import static org.hamcrest.Matchers.endsWith;
105104
import static org.hamcrest.Matchers.everyItem;
106105
import static org.hamcrest.Matchers.instanceOf;
106+
import static org.hamcrest.Matchers.is;
107107
import static org.hamcrest.Matchers.startsWith;
108108

109109
public class QueryTranslatorTests extends ESTestCase {
110110

111-
private static SqlFunctionRegistry sqlFunctionRegistry;
112-
private static SqlParser parser;
113-
private static Analyzer analyzer;
114-
private static Optimizer optimizer;
115-
private static Planner planner;
111+
private static class TestContext {
112+
private SqlFunctionRegistry sqlFunctionRegistry;
113+
private SqlParser parser;
114+
private Analyzer analyzer;
115+
private Optimizer optimizer;
116+
private Planner planner;
117+
118+
TestContext(String mappingFile) {
119+
parser = new SqlParser();
120+
sqlFunctionRegistry = new SqlFunctionRegistry();
121+
122+
Map<String, EsField> mapping = SqlTypesTests.loadMapping(mappingFile);
123+
EsIndex test = new EsIndex("test", mapping);
124+
IndexResolution getIndexResult = IndexResolution.valid(test);
125+
analyzer = new Analyzer(SqlTestUtils.TEST_CFG, sqlFunctionRegistry, getIndexResult, new Verifier(new Metrics()));
126+
optimizer = new Optimizer();
127+
planner = new Planner();
128+
}
129+
130+
public LogicalPlan plan(String sql) {
131+
return plan(sql, DateUtils.UTC);
132+
}
133+
134+
public LogicalPlan plan(String sql, ZoneId zoneId) {
135+
return analyzer.analyze(parser.createStatement(sql, zoneId), true);
136+
}
137+
138+
private PhysicalPlan optimizeAndPlan(String sql) {
139+
return optimizeAndPlan(plan(sql));
140+
}
141+
142+
private PhysicalPlan optimizeAndPlan(LogicalPlan plan) {
143+
return planner.plan(optimizer.optimize(plan),true);
144+
}
145+
146+
private LogicalPlan parameterizedSql(String sql, SqlTypedParamValue... params) {
147+
return analyzer.analyze(parser.createStatement(sql, Arrays.asList(params), DateUtils.UTC), true);
148+
}
149+
}
150+
151+
private static TestContext defaultTestContext;
116152

117153
@BeforeClass
118154
public static void init() {
119-
parser = new SqlParser();
120-
sqlFunctionRegistry = new SqlFunctionRegistry();
121-
122-
Map<String, EsField> mapping = SqlTypesTests.loadMapping("mapping-multi-field-variation.json");
123-
EsIndex test = new EsIndex("test", mapping);
124-
IndexResolution getIndexResult = IndexResolution.valid(test);
125-
analyzer = new Analyzer(SqlTestUtils.TEST_CFG, sqlFunctionRegistry, getIndexResult, new Verifier(new Metrics()));
126-
optimizer = new Optimizer();
127-
planner = new Planner();
155+
defaultTestContext = new TestContext("mapping-multi-field-variation.json");
128156
}
129157

130158
private LogicalPlan plan(String sql) {
131-
return plan(sql, UTC);
159+
return defaultTestContext.plan(sql, DateUtils.UTC);
132160
}
133161

134162
private LogicalPlan plan(String sql, ZoneId zoneId) {
135-
return analyzer.analyze(parser.createStatement(sql, zoneId), true);
163+
return defaultTestContext.plan(sql, zoneId);
136164
}
137165

138166
private PhysicalPlan optimizeAndPlan(String sql) {
139-
return optimizeAndPlan(plan(sql));
167+
return defaultTestContext.optimizeAndPlan(sql);
140168
}
141169

142170
private PhysicalPlan optimizeAndPlan(LogicalPlan plan) {
143-
return planner.plan(optimizer.optimize(plan),true);
171+
return defaultTestContext.optimizeAndPlan(plan);
144172
}
145173

146174
private QueryTranslation translate(Expression condition) {
@@ -152,7 +180,7 @@ private QueryTranslation translateWithAggs(Expression condition) {
152180
}
153181

154182
private LogicalPlan parameterizedSql(String sql, SqlTypedParamValue... params) {
155-
return analyzer.analyze(parser.createStatement(sql, Arrays.asList(params), org.elasticsearch.xpack.ql.type.DateUtils.UTC), true);
183+
return defaultTestContext.parameterizedSql(sql, params);
156184
}
157185

158186
public void testTermEqualityAnalyzer() {
@@ -426,7 +454,7 @@ private void testDateRangeWithCurrentFunctions_AndRangeOptimization(String funct
426454
assertEquals(lowerOperator.equals("<="), rq.includeUpper());
427455
assertEquals(upperOperator.equals(">="), rq.includeLower());
428456
assertEquals(pattern, rq.format());
429-
assertEquals(UTC, rq.zoneId());
457+
assertEquals(DateUtils.UTC, rq.zoneId());
430458
}
431459

432460
public void testDateRangeWithESDateMath() {
@@ -2104,7 +2132,7 @@ public void testHavingWithColumnImplicitGrouping() {
21042132
}
21052133

21062134
public void testScriptsInsideAggregateFunctions() {
2107-
for (FunctionDefinition fd : sqlFunctionRegistry.listFunctions()) {
2135+
for (FunctionDefinition fd : defaultTestContext.sqlFunctionRegistry.listFunctions()) {
21082136
if (AggregateFunction.class.isAssignableFrom(fd.clazz()) && (MatrixStatsEnclosed.class.isAssignableFrom(fd.clazz()) == false)) {
21092137
String aggFunction = fd.name() + "(ABS((int * 10) / 3) + 1";
21102138
if (fd.clazz() == Percentile.class || fd.clazz() == PercentileRank.class) {
@@ -2142,7 +2170,7 @@ public void testScriptsInsideAggregateFunctions() {
21422170
}
21432171

21442172
public void testScriptsInsideAggregateFunctions_WithHaving() {
2145-
for (FunctionDefinition fd : sqlFunctionRegistry.listFunctions()) {
2173+
for (FunctionDefinition fd : defaultTestContext.sqlFunctionRegistry.listFunctions()) {
21462174
if (AggregateFunction.class.isAssignableFrom(fd.clazz())
21472175
&& (MatrixStatsEnclosed.class.isAssignableFrom(fd.clazz()) == false)
21482176
// First/Last don't support having: https://github.com/elastic/elasticsearch/issues/37938
@@ -2195,7 +2223,7 @@ public void testScriptsInsideAggregateFunctions_ConvertedToStats() {
21952223
}
21962224

21972225
public void testScriptsInsideAggregateFunctions_ExtendedStats() {
2198-
for (FunctionDefinition fd : sqlFunctionRegistry.listFunctions()) {
2226+
for (FunctionDefinition fd : defaultTestContext.sqlFunctionRegistry.listFunctions()) {
21992227
if (ExtendedStatsEnclosed.class.isAssignableFrom(fd.clazz())) {
22002228
String aggFunction = fd.name() + "(ABS((int * 10) / 3) + 1)";
22012229
PhysicalPlan p = optimizeAndPlan("SELECT " + aggFunction + " FROM test");
@@ -2298,4 +2326,16 @@ public void testSameExpressionWithoutAlias() {
22982326
// these two should be semantically different reference attributes
22992327
assertNotEquals(eqe.output().get(0).id(), eqe.output().get(1).id());
23002328
}
2329+
2330+
public void testInOutOfRangeValues() {
2331+
QlIllegalArgumentException ex = expectThrows(QlIllegalArgumentException.class,
2332+
() -> optimizeAndPlan("SELECT int FROM test WHERE int IN (1, 2, 3, " + Long.MAX_VALUE + ", 5, 6, 7)"));
2333+
assertThat(ex.getMessage(), is("[" + Long.MAX_VALUE + "] out of [integer] range"));
2334+
}
2335+
2336+
public void testInInRangeValues() {
2337+
TestContext testContext = new TestContext("mapping-numeric.json");
2338+
PhysicalPlan p = testContext.optimizeAndPlan("SELECT long FROM test WHERE long IN (1, 2, 3, " + Long.MAX_VALUE + ", 5, 6, 7)");
2339+
assertEquals(EsQueryExec.class, p.getClass());
2340+
}
23012341
}

0 commit comments

Comments
 (0)