Skip to content

Commit fa49f6c

Browse files
committed
Override add for string concat and number addition (1773/2018)
Signed-off-by: Yuanchun Shen <yuanchu@amazon.com>
1 parent 411ceba commit fa49f6c

1 file changed

Lines changed: 13 additions & 16 deletions

File tree

core/src/main/java/org/opensearch/sql/expression/function/PPLFuncImpTable.java

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@
278278
import org.apache.logging.log4j.LogManager;
279279
import org.apache.logging.log4j.Logger;
280280
import org.opensearch.sql.calcite.CalcitePlanContext;
281+
import org.opensearch.sql.calcite.utils.OpenSearchTypeFactory;
281282
import org.opensearch.sql.calcite.utils.PPLOperandTypes;
282283
import org.opensearch.sql.calcite.utils.PlanUtils;
283284
import org.opensearch.sql.calcite.utils.UserDefinedFunctionUtils;
@@ -721,9 +722,6 @@ void populate() {
721722
registerOperator(AND, SqlStdOperatorTable.AND);
722723
registerOperator(OR, SqlStdOperatorTable.OR);
723724
registerOperator(NOT, SqlStdOperatorTable.NOT);
724-
725-
// Register ADDFUNCTION for numeric addition only
726-
registerOperator(ADDFUNCTION, SqlStdOperatorTable.PLUS);
727725
registerOperator(SUBTRACTFUNCTION, SqlStdOperatorTable.MINUS, OperandTypes.NUMERIC_NUMERIC);
728726
registerOperator(SUBTRACT, SqlStdOperatorTable.MINUS, OperandTypes.NUMERIC_NUMERIC);
729727
// Add DATETIME-DATETIME variant for timestamp binning support
@@ -1057,19 +1055,18 @@ void populate() {
10571055
registerOperator(JSON_EXTRACT_ALL, PPLBuiltinOperators.JSON_EXTRACT_ALL); // internal
10581056

10591057
// Register operators with a different type checker
1060-
1061-
// Register ADD (+ symbol) for string concatenation
1062-
// Replaced type checker since CONCAT also supports array concatenation
1063-
// registerOperator(
1064-
// ADD,
1065-
// SqlStdOperatorTable.CONCAT,
1066-
// OperandTypes.family(SqlTypeFamily.CHARACTER, SqlTypeFamily.CHARACTER));
1067-
// Register ADD (+ symbol) for numeric addition
1068-
// Replace type checker since PLUS also supports binary addition
1069-
registerOperator(
1070-
ADD,
1071-
SqlStdOperatorTable.PLUS,
1072-
OperandTypes.family(SqlTypeFamily.NUMERIC, SqlTypeFamily.NUMERIC));
1058+
// Register ADD (+ symbol) for string concatenation and numeric addition
1059+
// Not creating PPL builtin operator as it will cause confusion during function resolution
1060+
FunctionImp add =
1061+
(builder, args) -> {
1062+
SqlOperator op =
1063+
(Stream.of(args).map(RexNode::getType).anyMatch(OpenSearchTypeFactory::isCharacter))
1064+
? SqlStdOperatorTable.CONCAT
1065+
: SqlStdOperatorTable.PLUS;
1066+
return builder.makeCall(op, args);
1067+
};
1068+
register(ADD, add, SqlStdOperatorTable.PLUS.getOperandTypeChecker());
1069+
register(ADDFUNCTION, add, SqlStdOperatorTable.PLUS.getOperandTypeChecker());
10731070
// Replace with a custom CompositeOperandTypeChecker to check both operands as
10741071
// SqlStdOperatorTable.ITEM.getOperandTypeChecker() checks only the first
10751072
// operand instead

0 commit comments

Comments
 (0)