Skip to content

Commit 021d278

Browse files
authored
SQL: Do not resolve self-referencing aliases (elastic#62382)
Prevent the analyzer for trying to resolve aliases on expressions that reference themselves (or fields within themselves) as that causes infinite recursion. Fix elastic#62296
1 parent 96198be commit 021d278

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/analysis/analyzer/Analyzer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -867,7 +867,7 @@ private Expression replaceAliases(Expression condition, List<? extends NamedExpr
867867
boolean qualified = u.qualifier() != null;
868868
for (Alias alias : aliases) {
869869
// don't replace field with their own aliases (it creates infinite cycles)
870-
if (u != alias.child() &&
870+
if (alias.anyMatch(e -> e == u) == false &&
871871
(qualified ?
872872
Objects.equals(alias.qualifiedName(), u.qualifiedName()) :
873873
Objects.equals(alias.name(), u.name()))) {

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

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
*/
66
package org.elasticsearch.xpack.sql.analysis.analyzer;
77

8-
import java.util.stream.Collectors;
98
import org.elasticsearch.test.ESTestCase;
109
import org.elasticsearch.xpack.ql.QlIllegalArgumentException;
1110
import org.elasticsearch.xpack.ql.expression.Alias;
@@ -29,6 +28,7 @@
2928

3029
import java.util.List;
3130
import java.util.Map;
31+
import java.util.stream.Collectors;
3232

3333
import static org.elasticsearch.xpack.ql.type.DataTypes.BOOLEAN;
3434
import static org.elasticsearch.xpack.ql.type.DataTypes.KEYWORD;
@@ -277,4 +277,27 @@ public void testGroupByAmbiguity() {
277277
+ "matches any of [line 1:37 [m], line 1:55 [m]]",
278278
ex.getMessage());
279279
}
280+
281+
public void testFunctionOverNonExistingFieldAsArgumentAndSameAlias() throws Exception {
282+
Map<String, EsField> mapping = TypesTests.loadMapping("mapping-basic.json");
283+
EsIndex index = new EsIndex("test", mapping);
284+
getIndexResult = IndexResolution.valid(index);
285+
analyzer = new Analyzer(SqlTestUtils.TEST_CFG, functionRegistry, getIndexResult, verifier);
286+
287+
VerificationException ex = expectThrows(VerificationException.class, () ->
288+
plan("SELECT sum(missing) AS missing FROM test WHERE missing = 0"));
289+
assertEquals("Found 1 problem\nline 1:12: Unknown column [missing]", ex.getMessage());
290+
}
291+
292+
public void testFunctionWithExpressionOverNonExistingFieldAsArgumentAndSameAlias() throws Exception {
293+
Map<String, EsField> mapping = TypesTests.loadMapping("mapping-basic.json");
294+
EsIndex index = new EsIndex("test", mapping);
295+
getIndexResult = IndexResolution.valid(index);
296+
analyzer = new Analyzer(SqlTestUtils.TEST_CFG, functionRegistry, getIndexResult, verifier);
297+
298+
VerificationException ex = expectThrows(VerificationException.class, () ->
299+
plan("SELECT LENGTH(CONCAT(missing, 'x')) + 1 AS missing FROM test WHERE missing = 0"));
300+
assertEquals("Found 1 problem\nline 1:22: Unknown column [missing]", ex.getMessage());
301+
}
302+
280303
}

0 commit comments

Comments
 (0)