99
99
import static org .elasticsearch .xpack .sql .planner .QueryTranslator .DATE_FORMAT ;
100
100
import static org .elasticsearch .xpack .sql .planner .QueryTranslator .TIME_FORMAT ;
101
101
import static org .elasticsearch .xpack .sql .type .SqlDataTypes .DATE ;
102
- import static org .elasticsearch .xpack .sql .util .DateUtils .UTC ;
103
102
import static org .hamcrest .CoreMatchers .containsString ;
104
103
import static org .hamcrest .Matchers .endsWith ;
105
104
import static org .hamcrest .Matchers .everyItem ;
106
105
import static org .hamcrest .Matchers .instanceOf ;
106
+ import static org .hamcrest .Matchers .is ;
107
107
import static org .hamcrest .Matchers .startsWith ;
108
108
109
109
public class QueryTranslatorTests extends ESTestCase {
110
110
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 ;
116
152
117
153
@ BeforeClass
118
154
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" );
128
156
}
129
157
130
158
private LogicalPlan plan (String sql ) {
131
- return plan (sql , UTC );
159
+ return defaultTestContext . plan (sql , DateUtils . UTC );
132
160
}
133
161
134
162
private LogicalPlan plan (String sql , ZoneId zoneId ) {
135
- return analyzer . analyze ( parser . createStatement ( sql , zoneId ), true );
163
+ return defaultTestContext . plan ( sql , zoneId );
136
164
}
137
165
138
166
private PhysicalPlan optimizeAndPlan (String sql ) {
139
- return optimizeAndPlan (plan ( sql ) );
167
+ return defaultTestContext . optimizeAndPlan (sql );
140
168
}
141
169
142
170
private PhysicalPlan optimizeAndPlan (LogicalPlan plan ) {
143
- return planner . plan ( optimizer . optimize ( plan ), true );
171
+ return defaultTestContext . optimizeAndPlan ( plan );
144
172
}
145
173
146
174
private QueryTranslation translate (Expression condition ) {
@@ -152,7 +180,7 @@ private QueryTranslation translateWithAggs(Expression condition) {
152
180
}
153
181
154
182
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 );
156
184
}
157
185
158
186
public void testTermEqualityAnalyzer () {
@@ -426,7 +454,7 @@ private void testDateRangeWithCurrentFunctions_AndRangeOptimization(String funct
426
454
assertEquals (lowerOperator .equals ("<=" ), rq .includeUpper ());
427
455
assertEquals (upperOperator .equals (">=" ), rq .includeLower ());
428
456
assertEquals (pattern , rq .format ());
429
- assertEquals (UTC , rq .zoneId ());
457
+ assertEquals (DateUtils . UTC , rq .zoneId ());
430
458
}
431
459
432
460
public void testDateRangeWithESDateMath () {
@@ -2104,7 +2132,7 @@ public void testHavingWithColumnImplicitGrouping() {
2104
2132
}
2105
2133
2106
2134
public void testScriptsInsideAggregateFunctions () {
2107
- for (FunctionDefinition fd : sqlFunctionRegistry .listFunctions ()) {
2135
+ for (FunctionDefinition fd : defaultTestContext . sqlFunctionRegistry .listFunctions ()) {
2108
2136
if (AggregateFunction .class .isAssignableFrom (fd .clazz ()) && (MatrixStatsEnclosed .class .isAssignableFrom (fd .clazz ()) == false )) {
2109
2137
String aggFunction = fd .name () + "(ABS((int * 10) / 3) + 1" ;
2110
2138
if (fd .clazz () == Percentile .class || fd .clazz () == PercentileRank .class ) {
@@ -2142,7 +2170,7 @@ public void testScriptsInsideAggregateFunctions() {
2142
2170
}
2143
2171
2144
2172
public void testScriptsInsideAggregateFunctions_WithHaving () {
2145
- for (FunctionDefinition fd : sqlFunctionRegistry .listFunctions ()) {
2173
+ for (FunctionDefinition fd : defaultTestContext . sqlFunctionRegistry .listFunctions ()) {
2146
2174
if (AggregateFunction .class .isAssignableFrom (fd .clazz ())
2147
2175
&& (MatrixStatsEnclosed .class .isAssignableFrom (fd .clazz ()) == false )
2148
2176
// First/Last don't support having: https://github.com/elastic/elasticsearch/issues/37938
@@ -2195,7 +2223,7 @@ public void testScriptsInsideAggregateFunctions_ConvertedToStats() {
2195
2223
}
2196
2224
2197
2225
public void testScriptsInsideAggregateFunctions_ExtendedStats () {
2198
- for (FunctionDefinition fd : sqlFunctionRegistry .listFunctions ()) {
2226
+ for (FunctionDefinition fd : defaultTestContext . sqlFunctionRegistry .listFunctions ()) {
2199
2227
if (ExtendedStatsEnclosed .class .isAssignableFrom (fd .clazz ())) {
2200
2228
String aggFunction = fd .name () + "(ABS((int * 10) / 3) + 1)" ;
2201
2229
PhysicalPlan p = optimizeAndPlan ("SELECT " + aggFunction + " FROM test" );
@@ -2298,4 +2326,16 @@ public void testSameExpressionWithoutAlias() {
2298
2326
// these two should be semantically different reference attributes
2299
2327
assertNotEquals (eqe .output ().get (0 ).id (), eqe .output ().get (1 ).id ());
2300
2328
}
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
+ }
2301
2341
}
0 commit comments