Skip to content

Commit 2e6c61c

Browse files
committed
Directly delegate type checking to sql type checkers (1292/1599 | 1252/1872)
Signed-off-by: Yuanchun Shen <yuanchu@amazon.com>
1 parent afca88d commit 2e6c61c

9 files changed

Lines changed: 136 additions & 684 deletions

File tree

core/src/main/java/org/opensearch/sql/calcite/utils/PPLOperandTypes.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.apache.calcite.sql.type.CompositeOperandTypeChecker;
99
import org.apache.calcite.sql.type.FamilyOperandTypeChecker;
1010
import org.apache.calcite.sql.type.OperandTypes;
11+
import org.apache.calcite.sql.type.SqlOperandTypeChecker;
1112
import org.apache.calcite.sql.type.SqlTypeFamily;
1213
import org.opensearch.sql.expression.function.UDFOperandMetadata;
1314

@@ -84,10 +85,8 @@ private PPLOperandTypes() {}
8485
UDFOperandMetadata.wrap(
8586
(CompositeOperandTypeChecker)
8687
OperandTypes.ANY.or(OperandTypes.family(SqlTypeFamily.ANY, SqlTypeFamily.INTEGER)));
87-
public static final UDFOperandMetadata ANY_OPTIONAL_TIMESTAMP =
88-
UDFOperandMetadata.wrap(
89-
(CompositeOperandTypeChecker)
90-
OperandTypes.ANY.or(OperandTypes.family(SqlTypeFamily.ANY, SqlTypeFamily.TIMESTAMP)));
88+
public static final SqlOperandTypeChecker ANY_OPTIONAL_TIMESTAMP =
89+
OperandTypes.ANY.or(OperandTypes.family(SqlTypeFamily.ANY, SqlTypeFamily.TIMESTAMP));
9190
public static final UDFOperandMetadata INTEGER_INTEGER =
9291
UDFOperandMetadata.wrap((FamilyOperandTypeChecker) OperandTypes.INTEGER_INTEGER);
9392
public static final UDFOperandMetadata STRING_STRING =

core/src/main/java/org/opensearch/sql/calcite/validate/PplRelToSqlRelShuttle.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
import org.apache.calcite.rel.RelNode;
1111
import org.apache.calcite.rel.RelShuttleImpl;
1212
import org.apache.calcite.rex.RexBuilder;
13+
import org.apache.calcite.rex.RexCall;
1314
import org.apache.calcite.rex.RexLiteral;
1415
import org.apache.calcite.rex.RexNode;
1516
import org.apache.calcite.rex.RexShuttle;
1617
import org.apache.calcite.sql.SqlIntervalQualifier;
18+
import org.apache.calcite.sql.SqlKind;
1719

1820
/**
1921
* A RelShuttle that recursively visits all RelNodes and their RexNode expressions to fix interval

core/src/main/java/org/opensearch/sql/calcite/validate/PplTypeCoercion.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,9 @@ protected boolean dateTimeStringEquality(
150150
@Override
151151
public @Nullable RelDataType commonTypeForBinaryComparison(
152152
@Nullable RelDataType type1, @Nullable RelDataType type2) {
153-
// Prepend following rules for datetime comparisons
154-
// - (date, time) -> timestamp
155-
// - (time, timestamp) -> timestamp
153+
// Prepend following rules for datetime comparisons:
154+
// - (date, time) -> timestamp
155+
// - (time, timestamp) -> timestamp
156156
if (type1 != null & type2 != null) {
157157
boolean anyNullable = type1.isNullable() || type2.isNullable();
158158
if ((SqlTypeUtil.isDate(type1) && OpenSearchTypeFactory.isTime(type2))

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

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,13 @@
77

88
import java.util.List;
99
import org.apache.calcite.rel.type.RelDataType;
10+
import org.apache.calcite.sql.type.SqlOperandTypeChecker;
1011

1112
/** Function signature is composed by function name and arguments list. */
12-
public record CalciteFuncSignature(FunctionName functionName, PPLTypeChecker typeChecker) {
13+
public record CalciteFuncSignature(FunctionName functionName, SqlOperandTypeChecker typeChecker) {
1314

15+
// TODO: Refactor this match method
1416
public boolean match(FunctionName functionName, List<RelDataType> argTypes) {
15-
if (!functionName.equals(this.functionName())) return false;
16-
// For complex type checkers (e.g., OperandTypes.COMPARABLE_UNORDERED_COMPARABLE_UNORDERED),
17-
// the typeChecker will be null because only simple family-based type checks are currently
18-
// supported.
19-
if (typeChecker == null) return true;
20-
return typeChecker.checkOperandTypes(argTypes);
17+
return functionName.equals(this.functionName());
2118
}
2219
}

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

Lines changed: 0 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,11 @@
2323
import org.apache.calcite.linq4j.tree.Expression;
2424
import org.apache.calcite.rex.RexCall;
2525
import org.apache.calcite.sql.SqlAggFunction;
26-
import org.apache.calcite.sql.SqlCall;
27-
import org.apache.calcite.sql.SqlFunction;
28-
import org.apache.calcite.sql.SqlFunctionCategory;
2926
import org.apache.calcite.sql.SqlKind;
30-
import org.apache.calcite.sql.SqlLiteral;
31-
import org.apache.calcite.sql.SqlNode;
3227
import org.apache.calcite.sql.SqlOperator;
33-
import org.apache.calcite.sql.fun.SqlLibraryOperators;
34-
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
35-
import org.apache.calcite.sql.fun.SqlTrimFunction;
36-
import org.apache.calcite.sql.type.OperandTypes;
3728
import org.apache.calcite.sql.type.ReturnTypes;
3829
import org.apache.calcite.sql.type.SqlTypeTransforms;
3930
import org.apache.calcite.sql.util.ReflectiveSqlOperatorTable;
40-
import org.apache.calcite.sql.validate.SqlValidator;
4131
import org.apache.calcite.util.BuiltInMethod;
4232
import org.opensearch.sql.calcite.udf.udaf.FirstAggFunction;
4333
import org.opensearch.sql.calcite.udf.udaf.LastAggFunction;
@@ -144,130 +134,6 @@ public class PPLBuiltinOperators extends ReflectiveSqlOperatorTable {
144134
public static final SqlOperator SCALAR_MAX = new ScalarMaxFunction().toUDF("SCALAR_MAX");
145135
public static final SqlOperator SCALAR_MIN = new ScalarMinFunction().toUDF("SCALAR_MIN");
146136

147-
// Math functions with rewrite rules for validation
148-
public static final SqlOperator LOG_VALIDATOR =
149-
new SqlFunction(
150-
"LOG",
151-
SqlKind.LOG,
152-
ReturnTypes.DOUBLE_NULLABLE,
153-
null,
154-
OperandTypes.NUMERIC_OPTIONAL_NUMERIC,
155-
SqlFunctionCategory.USER_DEFINED_FUNCTION) {
156-
@Override
157-
public SqlNode rewriteCall(SqlValidator validator, SqlCall call) {
158-
// Rewrite LOG(x, b) to LOG(b, x) - swap arguments for Calcite compatibility
159-
if (call.operandCount() == 2) {
160-
return SqlLibraryOperators.LOG.createCall(
161-
call.getParserPosition(), call.operand(1), call.operand(0));
162-
}
163-
return super.rewriteCall(validator, call);
164-
}
165-
};
166-
167-
public static final SqlFunction ATAN_VALIDATOR =
168-
new SqlFunction(
169-
"ATAN",
170-
SqlKind.OTHER_FUNCTION,
171-
ReturnTypes.DOUBLE_NULLABLE,
172-
null,
173-
OperandTypes.NUMERIC_OPTIONAL_NUMERIC,
174-
SqlFunctionCategory.USER_DEFINED_FUNCTION) {
175-
@Override
176-
public SqlNode rewriteCall(SqlValidator validator, SqlCall call) {
177-
// Rewrite ATAN(y, x) to ATAN2(y, x)
178-
if (call.operandCount() == 2) {
179-
return SqlStdOperatorTable.ATAN2.createCall(
180-
call.getParserPosition(), call.operand(0), call.operand(1));
181-
}
182-
return super.rewriteCall(validator, call);
183-
}
184-
};
185-
186-
public static final SqlFunction SQRT_VALIDATOR =
187-
new SqlFunction(
188-
"SQRT",
189-
SqlKind.OTHER_FUNCTION,
190-
ReturnTypes.DOUBLE_NULLABLE,
191-
null,
192-
OperandTypes.NUMERIC,
193-
SqlFunctionCategory.USER_DEFINED_FUNCTION) {
194-
@Override
195-
public SqlNode rewriteCall(SqlValidator validator, SqlCall call) {
196-
// Rewrite SQRT(x) to POWER(x, 0.5)
197-
return SqlStdOperatorTable.POWER.createCall(
198-
call.getParserPosition(),
199-
call.operand(0),
200-
SqlLiteral.createExactNumeric("0.5", call.getParserPosition()));
201-
}
202-
};
203-
204-
// String functions with rewrite rules for validation
205-
public static final SqlFunction TRIM_VALIDATOR =
206-
new SqlFunction(
207-
"TRIM",
208-
SqlKind.TRIM,
209-
ReturnTypes.VARCHAR_NULLABLE,
210-
null,
211-
OperandTypes.CHARACTER,
212-
SqlFunctionCategory.USER_DEFINED_FUNCTION) {
213-
@Override
214-
public SqlNode rewriteCall(SqlValidator validator, SqlCall call) {
215-
// Rewrite TRIM(x) to TRIM(BOTH ' ' FROM x)
216-
if (call.operandCount() == 1) {
217-
return SqlStdOperatorTable.TRIM.createCall(
218-
call.getParserPosition(),
219-
SqlLiteral.createSymbol(SqlTrimFunction.Flag.BOTH, call.getParserPosition()),
220-
SqlLiteral.createCharString(" ", call.getParserPosition()),
221-
call.operand(0));
222-
}
223-
return super.rewriteCall(validator, call);
224-
}
225-
};
226-
227-
public static final SqlFunction LTRIM_VALIDATOR =
228-
new SqlFunction(
229-
"LTRIM",
230-
SqlKind.LTRIM,
231-
ReturnTypes.VARCHAR_NULLABLE,
232-
null,
233-
OperandTypes.CHARACTER,
234-
SqlFunctionCategory.USER_DEFINED_FUNCTION) {
235-
@Override
236-
public SqlNode rewriteCall(SqlValidator validator, SqlCall call) {
237-
// Rewrite LTRIM(x) to TRIM(LEADING ' ' FROM x)
238-
if (call.operandCount() == 1) {
239-
return SqlStdOperatorTable.TRIM.createCall(
240-
call.getParserPosition(),
241-
SqlLiteral.createSymbol(SqlTrimFunction.Flag.LEADING, call.getParserPosition()),
242-
SqlLiteral.createCharString(" ", call.getParserPosition()),
243-
call.operand(0));
244-
}
245-
return super.rewriteCall(validator, call);
246-
}
247-
};
248-
249-
public static final SqlFunction RTRIM_VALIDATOR =
250-
new SqlFunction(
251-
"RTRIM",
252-
SqlKind.RTRIM,
253-
ReturnTypes.VARCHAR_NULLABLE,
254-
null,
255-
OperandTypes.CHARACTER,
256-
SqlFunctionCategory.USER_DEFINED_FUNCTION) {
257-
@Override
258-
public SqlNode rewriteCall(SqlValidator validator, SqlCall call) {
259-
// Rewrite RTRIM(x) to TRIM(TRAILING ' ' FROM x)
260-
if (call.operandCount() == 1) {
261-
return SqlStdOperatorTable.TRIM.createCall(
262-
call.getParserPosition(),
263-
SqlLiteral.createSymbol(SqlTrimFunction.Flag.TRAILING, call.getParserPosition()),
264-
SqlLiteral.createCharString(" ", call.getParserPosition()),
265-
call.operand(0));
266-
}
267-
return super.rewriteCall(validator, call);
268-
}
269-
};
270-
271137
public static final SqlOperator COSH =
272138
adaptMathFunctionToUDF(
273139
"cosh", ReturnTypes.DOUBLE_FORCE_NULLABLE, NullPolicy.ANY, PPLOperandTypes.NUMERIC)

0 commit comments

Comments
 (0)