Skip to content

Commit 638c3d6

Browse files
committed
Support parameter validation for nullif, isempty, isblank
Signed-off-by: Yuanchun Shen <yuanchu@amazon.com>
1 parent 45f1566 commit 638c3d6

1 file changed

Lines changed: 22 additions & 23 deletions

File tree

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

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,6 @@
88
import static org.apache.calcite.sql.type.SqlTypeFamily.IGNORE;
99
import static org.opensearch.sql.calcite.utils.OpenSearchTypeFactory.getLegacyTypeName;
1010
import static org.opensearch.sql.expression.function.BuiltinFunctionName.*;
11-
import static org.opensearch.sql.expression.function.PPLTypeChecker.family;
12-
import static org.opensearch.sql.expression.function.PPLTypeChecker.wrapComparable;
13-
import static org.opensearch.sql.expression.function.PPLTypeChecker.wrapComposite;
14-
import static org.opensearch.sql.expression.function.PPLTypeChecker.wrapFamily;
1511

1612
import com.google.common.collect.ImmutableMap;
1713
import java.math.BigDecimal;
@@ -66,7 +62,7 @@ default PPLTypeChecker getTypeChecker() {
6662
public interface FunctionImp1 extends FunctionImp {
6763
RexNode resolve(RexBuilder builder, RexNode arg1);
6864

69-
PPLTypeChecker IGNORE_1 = family(IGNORE);
65+
PPLTypeChecker IGNORE_1 = PPLTypeChecker.family(IGNORE);
7066

7167
@Override
7268
default RexNode resolve(RexBuilder builder, RexNode... args) {
@@ -83,7 +79,7 @@ default PPLTypeChecker getTypeChecker() {
8379
}
8480

8581
public interface FunctionImp2 extends FunctionImp {
86-
PPLTypeChecker IGNORE_2 = family(IGNORE, IGNORE);
82+
PPLTypeChecker IGNORE_2 = PPLTypeChecker.family(IGNORE, IGNORE);
8783

8884
RexNode resolve(RexBuilder builder, RexNode arg1, RexNode arg2);
8985

@@ -235,7 +231,7 @@ public RexNode resolve(RexBuilder builder, RexNode... args) {
235231
@Override
236232
public PPLTypeChecker getTypeChecker() {
237233
try {
238-
return wrapComposite(typeChecker, checkCompositionType);
234+
return PPLTypeChecker.wrapComposite(typeChecker, checkCompositionType);
239235
} catch (IllegalArgumentException | UnsupportedOperationException e) {
240236
logger.debug(
241237
String.format(
@@ -259,7 +255,7 @@ public RexNode resolve(RexBuilder builder, RexNode... args) {
259255

260256
@Override
261257
public PPLTypeChecker getTypeChecker() {
262-
return wrapFamily(typeChecker);
258+
return PPLTypeChecker.wrapFamily(typeChecker);
263259
}
264260
};
265261
}
@@ -274,7 +270,7 @@ public RexNode resolve(RexBuilder builder, RexNode... args) {
274270

275271
@Override
276272
public PPLTypeChecker getTypeChecker() {
277-
return wrapComparable(typeChecker);
273+
return PPLTypeChecker.wrapComparable(typeChecker);
278274
}
279275
};
280276
}
@@ -469,7 +465,7 @@ void populate() {
469465
builder.makeFlag(Flag.BOTH),
470466
builder.makeLiteral(" "),
471467
arg),
472-
family(SqlTypeFamily.STRING)));
468+
PPLTypeChecker.family(SqlTypeFamily.STRING)));
473469

474470
register(
475471
LTRIM,
@@ -480,7 +476,7 @@ void populate() {
480476
builder.makeFlag(Flag.LEADING),
481477
builder.makeLiteral(" "),
482478
arg),
483-
family(SqlTypeFamily.STRING)));
479+
PPLTypeChecker.family(SqlTypeFamily.STRING)));
484480
register(
485481
RTRIM,
486482
createFunctionImpWithTypeChecker(
@@ -490,12 +486,12 @@ void populate() {
490486
builder.makeFlag(Flag.TRAILING),
491487
builder.makeLiteral(" "),
492488
arg),
493-
family(SqlTypeFamily.STRING)));
489+
PPLTypeChecker.family(SqlTypeFamily.STRING)));
494490
register(
495491
STRCMP,
496492
createFunctionImpWithTypeChecker(
497493
(builder, arg1, arg2) -> builder.makeCall(SqlLibraryOperators.STRCMP, arg2, arg1),
498-
family(SqlTypeFamily.STRING, SqlTypeFamily.STRING)));
494+
PPLTypeChecker.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING)));
499495
// SqlStdOperatorTable.SUBSTRING.getOperandTypeChecker is null. We manually create a type
500496
// checker for it.
501497
register(
@@ -516,7 +512,7 @@ void populate() {
516512
LOG,
517513
createFunctionImpWithTypeChecker(
518514
(builder, arg1, arg2) -> builder.makeCall(SqlLibraryOperators.LOG, arg2, arg1),
519-
family(SqlTypeFamily.NUMERIC, SqlTypeFamily.NUMERIC)));
515+
PPLTypeChecker.family(SqlTypeFamily.NUMERIC, SqlTypeFamily.NUMERIC)));
520516
register(
521517
LOG,
522518
createFunctionImpWithTypeChecker(
@@ -525,7 +521,7 @@ void populate() {
525521
SqlLibraryOperators.LOG,
526522
arg,
527523
builder.makeApproxLiteral(BigDecimal.valueOf(Math.E))),
528-
family(SqlTypeFamily.NUMERIC)));
524+
PPLTypeChecker.family(SqlTypeFamily.NUMERIC)));
529525
// SqlStdOperatorTable.SQRT is declared but not implemented. The call to SQRT in Calcite is
530526
// converted to POWER(x, 0.5).
531527
register(
@@ -536,7 +532,7 @@ void populate() {
536532
SqlStdOperatorTable.POWER,
537533
arg,
538534
builder.makeApproxLiteral(BigDecimal.valueOf(0.5))),
539-
family(SqlTypeFamily.NUMERIC)));
535+
PPLTypeChecker.family(SqlTypeFamily.NUMERIC)));
540536
register(
541537
TYPEOF,
542538
(FunctionImp1)
@@ -553,24 +549,26 @@ void populate() {
553549
OperandTypes.family(SqlTypeFamily.BOOLEAN, SqlTypeFamily.ANY, SqlTypeFamily.ANY)));
554550
register(
555551
NULLIF,
556-
(FunctionImp2)
552+
createFunctionImpWithTypeChecker(
557553
(builder, arg1, arg2) ->
558554
builder.makeCall(
559555
SqlStdOperatorTable.CASE,
560556
builder.makeCall(SqlStdOperatorTable.EQUALS, arg1, arg2),
561557
builder.makeNullLiteral(arg1.getType()),
562-
arg1));
558+
arg1),
559+
PPLTypeChecker.wrapComparable((SameOperandTypeChecker) OperandTypes.SAME_SAME)));
563560
register(
564561
IS_EMPTY,
565-
((FunctionImp1)
562+
createFunctionImpWithTypeChecker(
566563
(builder, arg) ->
567564
builder.makeCall(
568565
SqlStdOperatorTable.OR,
569566
builder.makeCall(SqlStdOperatorTable.IS_NULL, arg),
570-
builder.makeCall(SqlStdOperatorTable.IS_EMPTY, arg))));
567+
builder.makeCall(SqlStdOperatorTable.IS_EMPTY, arg)),
568+
PPLTypeChecker.family(SqlTypeFamily.ANY)));
571569
register(
572570
IS_BLANK,
573-
((FunctionImp1)
571+
createFunctionImpWithTypeChecker(
574572
(builder, arg) ->
575573
builder.makeCall(
576574
SqlStdOperatorTable.OR,
@@ -581,7 +579,8 @@ void populate() {
581579
SqlStdOperatorTable.TRIM,
582580
builder.makeFlag(Flag.BOTH),
583581
builder.makeLiteral(" "),
584-
arg)))));
582+
arg))),
583+
PPLTypeChecker.family(SqlTypeFamily.ANY)));
585584
}
586585
}
587586

@@ -614,7 +613,7 @@ public RexNode resolve(RexBuilder builder, RexNode arg1, RexNode arg2) {
614613
@Override
615614
public PPLTypeChecker getTypeChecker() {
616615
SqlTypeFamily booleanFamily = SqlTypeName.BOOLEAN.getFamily();
617-
return family(booleanFamily, booleanFamily);
616+
return PPLTypeChecker.family(booleanFamily, booleanFamily);
618617
}
619618
}
620619
}

0 commit comments

Comments
 (0)