Skip to content

Commit f4d0110

Browse files
[BugFix] fix concat_ws(',', 1, NULL) incorrect result when last element is NULL (backport #56384) (#56456)
Co-authored-by: kaijianding <[email protected]>
1 parent 2eb0e8e commit f4d0110

File tree

2 files changed

+45
-25
lines changed

2 files changed

+45
-25
lines changed

fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rewrite/ScalarOperatorFunctions.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,12 @@
7777
import java.time.temporal.IsoFields;
7878
import java.time.temporal.TemporalAdjusters;
7979
import java.time.temporal.TemporalUnit;
80+
import java.util.Arrays;
8081
import java.util.HashSet;
8182
import java.util.List;
8283
import java.util.Map;
8384
import java.util.Set;
85+
import java.util.stream.Collectors;
8486

8587
import static com.starrocks.catalog.PrimitiveType.BIGINT;
8688
import static com.starrocks.catalog.PrimitiveType.BITMAP;
@@ -1297,15 +1299,13 @@ public static ConstantOperator concat_ws(ConstantOperator split, ConstantOperato
12971299
if (split.isNull()) {
12981300
return ConstantOperator.createNull(Type.VARCHAR);
12991301
}
1300-
final StringBuilder resultBuilder = new StringBuilder();
1301-
for (int i = 0; i < values.length - 1; i++) {
1302-
if (values[i].isNull()) {
1303-
continue;
1304-
}
1305-
resultBuilder.append(values[i].getVarchar()).append(split.getVarchar());
1306-
}
1307-
resultBuilder.append(values[values.length - 1].getVarchar());
1308-
return ConstantOperator.createVarchar(resultBuilder.toString());
1302+
String separator = split.getVarchar();
1303+
return ConstantOperator.createVarchar(
1304+
Arrays.stream(values)
1305+
.filter(v -> !v.isNull())
1306+
.map(ConstantOperator::getVarchar)
1307+
.collect(Collectors.joining(separator))
1308+
);
13091309
}
13101310

13111311
@ConstantFunction(name = "version", argTypes = {}, returnType = VARCHAR)

fe/fe-core/src/test/java/com/starrocks/sql/optimizer/rewrite/ScalarOperatorFunctionsTest.java

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1322,22 +1322,42 @@ public void concat_ws() {
13221322

13231323
@Test
13241324
public void concat_ws_with_null() {
1325-
ConstantOperator[] argWithNull = {ConstantOperator.createVarchar("star"),
1326-
ConstantOperator.createNull(Type.VARCHAR),
1327-
ConstantOperator.createVarchar("cks")};
1328-
ConstantOperator result =
1329-
ScalarOperatorFunctions.concat_ws(ConstantOperator.createVarchar("ro"), argWithNull);
1330-
assertEquals(Type.VARCHAR, result.getType());
1331-
assertEquals("starrocks", result.getVarchar());
1332-
1333-
result = ScalarOperatorFunctions.concat_ws(ConstantOperator.createVarchar(","),
1334-
ConstantOperator.createNull(Type.VARCHAR));
1335-
assertEquals("", result.getVarchar());
1336-
1337-
ConstantOperator[] argWithoutNull = {ConstantOperator.createVarchar("star"),
1338-
ConstantOperator.createVarchar("cks")};
1339-
result = ScalarOperatorFunctions.concat_ws(ConstantOperator.createNull(Type.VARCHAR), argWithoutNull);
1340-
assertTrue(result.isNull());
1325+
{
1326+
ConstantOperator[] argWithNull = {ConstantOperator.createVarchar("star"),
1327+
ConstantOperator.createNull(Type.VARCHAR),
1328+
ConstantOperator.createVarchar("cks")};
1329+
ConstantOperator result =
1330+
ScalarOperatorFunctions.concat_ws(ConstantOperator.createVarchar("ro"), argWithNull);
1331+
assertEquals(Type.VARCHAR, result.getType());
1332+
assertEquals("starrocks", result.getVarchar());
1333+
}
1334+
{
1335+
ConstantOperator[] argWithNull = {ConstantOperator.createVarchar("1"),
1336+
ConstantOperator.createNull(Type.VARCHAR)};
1337+
ConstantOperator result =
1338+
ScalarOperatorFunctions.concat_ws(ConstantOperator.createVarchar(","), argWithNull);
1339+
assertEquals(Type.VARCHAR, result.getType());
1340+
assertEquals("1", result.getVarchar());
1341+
}
1342+
{
1343+
ConstantOperator[] argWithNull = {ConstantOperator.createVarchar("1"),
1344+
ConstantOperator.createNull(Type.VARCHAR),
1345+
ConstantOperator.createNull(Type.VARCHAR)};
1346+
ConstantOperator result =
1347+
ScalarOperatorFunctions.concat_ws(ConstantOperator.createVarchar(","), argWithNull);
1348+
assertEquals(Type.VARCHAR, result.getType());
1349+
assertEquals("1", result.getVarchar());
1350+
}
1351+
{
1352+
ConstantOperator result = ScalarOperatorFunctions.concat_ws(ConstantOperator.createVarchar(","),
1353+
ConstantOperator.createNull(Type.VARCHAR));
1354+
assertEquals("", result.getVarchar());
1355+
1356+
ConstantOperator[] argWithoutNull = {ConstantOperator.createVarchar("star"),
1357+
ConstantOperator.createVarchar("cks")};
1358+
result = ScalarOperatorFunctions.concat_ws(ConstantOperator.createNull(Type.VARCHAR), argWithoutNull);
1359+
assertTrue(result.isNull());
1360+
}
13411361
}
13421362

13431363
@Test

0 commit comments

Comments
 (0)