Skip to content

Commit 7b618f3

Browse files
authored
SQL: Bug fix for the optional "start" parameter usage inside LOCATE function (#32576)
The incorrect NodeInfo is created when the optional parameter is not used, leading to the incorrect constructor being used. Simplified LocateFunctionProcessorDefinition by using one constructor instead of two. Fixes #32554
1 parent 6750e15 commit 7b618f3

File tree

3 files changed

+26
-74
lines changed

3 files changed

+26
-74
lines changed

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/Locate.java

+4-14
Original file line numberDiff line numberDiff line change
@@ -62,20 +62,10 @@ protected TypeResolution resolveType() {
6262

6363
@Override
6464
protected ProcessorDefinition makeProcessorDefinition() {
65-
LocateFunctionProcessorDefinition processorDefinition;
66-
if (start == null) {
67-
processorDefinition = new LocateFunctionProcessorDefinition(location(), this,
68-
ProcessorDefinitions.toProcessorDefinition(pattern),
69-
ProcessorDefinitions.toProcessorDefinition(source));
70-
}
71-
else {
72-
processorDefinition = new LocateFunctionProcessorDefinition(location(), this,
73-
ProcessorDefinitions.toProcessorDefinition(pattern),
74-
ProcessorDefinitions.toProcessorDefinition(source),
75-
ProcessorDefinitions.toProcessorDefinition(start));
76-
}
77-
78-
return processorDefinition;
65+
return new LocateFunctionProcessorDefinition(location(), this,
66+
ProcessorDefinitions.toProcessorDefinition(pattern),
67+
ProcessorDefinitions.toProcessorDefinition(source),
68+
start == null ? null : ProcessorDefinitions.toProcessorDefinition(start));
7969
}
8070

8171
@Override

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/LocateFunctionProcessorDefinition.java

+1-12
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,12 @@ public class LocateFunctionProcessorDefinition extends ProcessorDefinition {
2121

2222
public LocateFunctionProcessorDefinition(Location location, Expression expression, ProcessorDefinition pattern,
2323
ProcessorDefinition source, ProcessorDefinition start) {
24-
super(location, expression, Arrays.asList(pattern, source, start));
24+
super(location, expression, start == null ? Arrays.asList(pattern, source) : Arrays.asList(pattern, source, start));
2525
this.pattern = pattern;
2626
this.source = source;
2727
this.start = start;
2828
}
2929

30-
public LocateFunctionProcessorDefinition(Location location, Expression expression, ProcessorDefinition pattern,
31-
ProcessorDefinition source) {
32-
super(location, expression, Arrays.asList(pattern, source));
33-
this.pattern = pattern;
34-
this.source = source;
35-
this.start = null;
36-
}
37-
3830
@Override
3931
public final ProcessorDefinition replaceChildren(List<ProcessorDefinition> newChildren) {
4032
int childrenSize = newChildren.size();
@@ -68,9 +60,6 @@ public boolean resolved() {
6860

6961
protected ProcessorDefinition replaceChildren(ProcessorDefinition newPattern, ProcessorDefinition newSource,
7062
ProcessorDefinition newStart) {
71-
if (newStart == null) {
72-
return new LocateFunctionProcessorDefinition(location(), expression(), newPattern, newSource);
73-
}
7463
return new LocateFunctionProcessorDefinition(location(), expression(), newPattern, newSource, newStart);
7564
}
7665

x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/string/LocateFunctionProcessorDefinitionTests.java

+21-48
Original file line numberDiff line numberDiff line change
@@ -38,50 +38,34 @@ public static LocateFunctionProcessorDefinition randomLocateFunctionProcessorDef
3838
return (LocateFunctionProcessorDefinition) (new Locate(randomLocation(),
3939
randomStringLiteral(),
4040
randomStringLiteral(),
41-
frequently() ? randomIntLiteral() : null)
41+
randomFrom(true, false) ? randomIntLiteral() : null)
4242
.makeProcessorDefinition());
4343
}
4444

45-
@AwaitsFix(bugUrl = "https://github.com/elastic/elasticsearch/issues/32554")
4645
@Override
4746
public void testTransform() {
4847
// test transforming only the properties (location, expression),
4948
// skipping the children (the two parameters of the binary function) which are tested separately
5049
LocateFunctionProcessorDefinition b1 = randomInstance();
5150
Expression newExpression = randomValueOtherThan(b1.expression(), () -> randomLocateFunctionExpression());
52-
LocateFunctionProcessorDefinition newB;
53-
if (b1.start() == null) {
54-
newB = new LocateFunctionProcessorDefinition(
55-
b1.location(),
56-
newExpression,
57-
b1.pattern(),
58-
b1.source());
59-
} else {
60-
newB = new LocateFunctionProcessorDefinition(
61-
b1.location(),
62-
newExpression,
63-
b1.pattern(),
64-
b1.source(),
65-
b1.start());
66-
}
51+
LocateFunctionProcessorDefinition newB = new LocateFunctionProcessorDefinition(
52+
b1.location(),
53+
newExpression,
54+
b1.pattern(),
55+
b1.source(),
56+
b1.start());
57+
6758
assertEquals(newB, b1.transformPropertiesOnly(v -> Objects.equals(v, b1.expression()) ? newExpression : v, Expression.class));
6859

6960
LocateFunctionProcessorDefinition b2 = randomInstance();
7061
Location newLoc = randomValueOtherThan(b2.location(), () -> randomLocation());
71-
if (b2.start() == null) {
72-
newB = new LocateFunctionProcessorDefinition(
73-
newLoc,
74-
b2.expression(),
75-
b2.pattern(),
76-
b2.source());
77-
} else {
78-
newB = new LocateFunctionProcessorDefinition(
79-
newLoc,
80-
b2.expression(),
81-
b2.pattern(),
82-
b2.source(),
83-
b2.start());
84-
}
62+
newB = new LocateFunctionProcessorDefinition(
63+
newLoc,
64+
b2.expression(),
65+
b2.pattern(),
66+
b2.source(),
67+
b2.start());
68+
8569
assertEquals(newB,
8670
b2.transformPropertiesOnly(v -> Objects.equals(v, b2.location()) ? newLoc : v, Location.class));
8771
}
@@ -93,15 +77,9 @@ public void testReplaceChildren() {
9377
ProcessorDefinition newSource = toProcessorDefinition((Expression) randomValueOtherThan(b.source(), () -> randomStringLiteral()));
9478
ProcessorDefinition newStart;
9579

96-
LocateFunctionProcessorDefinition newB;
97-
if (b.start() == null) {
98-
newB = new LocateFunctionProcessorDefinition(b.location(), b.expression(), b.pattern(), b.source());
99-
newStart = null;
100-
}
101-
else {
102-
newB = new LocateFunctionProcessorDefinition(b.location(), b.expression(), b.pattern(), b.source(), b.start());
103-
newStart = toProcessorDefinition((Expression) randomValueOtherThan(b.start(), () -> randomIntLiteral()));
104-
}
80+
LocateFunctionProcessorDefinition newB = new LocateFunctionProcessorDefinition(
81+
b.location(), b.expression(), b.pattern(), b.source(), b.start());
82+
newStart = toProcessorDefinition((Expression) randomValueOtherThan(b.start(), () -> randomIntLiteral()));
10583
LocateFunctionProcessorDefinition transformed = null;
10684

10785
// generate all the combinations of possible children modifications and test all of them
@@ -132,7 +110,8 @@ protected LocateFunctionProcessorDefinition mutate(LocateFunctionProcessorDefini
132110
comb.get(0) ? toProcessorDefinition((Expression) randomValueOtherThan(f.pattern(),
133111
() -> randomStringLiteral())) : f.pattern(),
134112
comb.get(1) ? toProcessorDefinition((Expression) randomValueOtherThan(f.source(),
135-
() -> randomStringLiteral())) : f.source()));
113+
() -> randomStringLiteral())) : f.source(),
114+
null));
136115
}
137116
}
138117
} else {
@@ -155,13 +134,7 @@ protected LocateFunctionProcessorDefinition mutate(LocateFunctionProcessorDefini
155134

156135
@Override
157136
protected LocateFunctionProcessorDefinition copy(LocateFunctionProcessorDefinition instance) {
158-
return instance.start() == null ?
159-
new LocateFunctionProcessorDefinition(instance.location(),
160-
instance.expression(),
161-
instance.pattern(),
162-
instance.source())
163-
:
164-
new LocateFunctionProcessorDefinition(instance.location(),
137+
return new LocateFunctionProcessorDefinition(instance.location(),
165138
instance.expression(),
166139
instance.pattern(),
167140
instance.source(),

0 commit comments

Comments
 (0)