in modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/RexToLixTranslator.java [333:491]
private Expression getConvertExpression(
RelDataType sourceType,
RelDataType targetType,
Expression operand,
ConstantExpression format) {
final Supplier<Expression> defaultExpression = () ->
ConverterUtils.convert(operand, targetType);
switch (targetType.getSqlTypeName()) {
case ANY:
var toCustomType = CustomTypesConversion.INSTANCE.tryConvert(operand, targetType);
return (toCustomType != null) ? toCustomType: operand;
case VARBINARY:
case BINARY:
switch (sourceType.getSqlTypeName()) {
case CHAR:
case VARCHAR:
return Expressions.call(IgniteMethod.STRING_TO_BYTESTRING.method(), operand);
default:
return defaultExpression.get();
}
case GEOMETRY:
switch (sourceType.getSqlTypeName()) {
case CHAR:
case VARCHAR:
return Expressions.call(BuiltInMethod.ST_GEOM_FROM_EWKT.method, operand);
default:
return defaultExpression.get();
}
case DATE:
return translateCastToDate(sourceType, operand, format, defaultExpression);
case TIME:
return translateCastToTime(sourceType, operand, format, defaultExpression);
case TIME_WITH_LOCAL_TIME_ZONE:
return translateCastToTimeWithLocalTimeZone(sourceType, operand, defaultExpression);
case TIMESTAMP:
return translateCastToTimestamp(sourceType, operand, format, defaultExpression);
case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
return translateCastToTimestampWithLocalTimeZone(sourceType, targetType, operand, defaultExpression);
case BOOLEAN:
switch (sourceType.getSqlTypeName()) {
case CHAR:
case VARCHAR:
return Expressions.call(BuiltInMethod.STRING_TO_BOOLEAN.method, operand);
default:
return defaultExpression.get();
}
case CHAR:
case VARCHAR:
final SqlIntervalQualifier interval =
sourceType.getIntervalQualifier();
switch (sourceType.getSqlTypeName()) {
// If format string is supplied, return formatted date/time/timestamp
case DATE:
return RexImpTable.optimize2(operand, Expressions.isConstantNull(format)
? Expressions.call(BuiltInMethod.UNIX_DATE_TO_STRING.method, operand)
: Expressions.call(
Expressions.new_(
BuiltInMethod.FORMAT_DATE.method.getDeclaringClass()),
BuiltInMethod.FORMAT_DATE.method, format, operand));
case TIME:
return RexImpTable.optimize2(operand, Expressions.isConstantNull(format)
? Expressions.call(
IgniteMethod.UNIX_TIME_TO_STRING_PRECISION_AWARE.method(),
operand,
Expressions.constant(sourceType.getPrecision()))
: Expressions.call(
Expressions.new_(
BuiltInMethod.FORMAT_TIME.method.getDeclaringClass()),
BuiltInMethod.FORMAT_TIME.method, format, operand));
case TIME_WITH_LOCAL_TIME_ZONE:
return RexImpTable.optimize2(operand, Expressions.isConstantNull(format)
? Expressions.call(BuiltInMethod.TIME_WITH_LOCAL_TIME_ZONE_TO_STRING.method, operand,
Expressions.call(BuiltInMethod.TIME_ZONE.method, root))
: Expressions.call(
Expressions.new_(
BuiltInMethod.FORMAT_TIME.method.getDeclaringClass()),
BuiltInMethod.FORMAT_TIME.method, format, operand));
case TIMESTAMP:
return RexImpTable.optimize2(operand, Expressions.isConstantNull(format)
? Expressions.call(
IgniteMethod.UNIX_TIMESTAMP_TO_STRING_PRECISION_AWARE.method(),
operand,
Expressions.constant(sourceType.getPrecision()))
: Expressions.call(
Expressions.new_(
BuiltInMethod.FORMAT_TIMESTAMP.method.getDeclaringClass()),
BuiltInMethod.FORMAT_TIMESTAMP.method, format, operand));
case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
return RexImpTable.optimize2(operand, Expressions.isConstantNull(format)
? Expressions.call(BuiltInMethod.TIMESTAMP_WITH_LOCAL_TIME_ZONE_TO_STRING.method,
operand, Expressions.call(BuiltInMethod.TIME_ZONE.method, root))
: Expressions.call(
Expressions.new_(
BuiltInMethod.FORMAT_TIMESTAMP.method.getDeclaringClass()),
BuiltInMethod.FORMAT_TIMESTAMP.method, format, operand));
case INTERVAL_YEAR:
case INTERVAL_YEAR_MONTH:
case INTERVAL_MONTH:
return RexImpTable.optimize2(operand,
Expressions.call(BuiltInMethod.INTERVAL_YEAR_MONTH_TO_STRING.method,
operand,
Expressions.constant(
requireNonNull(interval, "interval").timeUnitRange)));
case INTERVAL_DAY:
case INTERVAL_DAY_HOUR:
case INTERVAL_DAY_MINUTE:
case INTERVAL_DAY_SECOND:
case INTERVAL_HOUR:
case INTERVAL_HOUR_MINUTE:
case INTERVAL_HOUR_SECOND:
case INTERVAL_MINUTE:
case INTERVAL_MINUTE_SECOND:
case INTERVAL_SECOND:
return RexImpTable.optimize2(operand,
Expressions.call(BuiltInMethod.INTERVAL_DAY_TIME_TO_STRING.method,
operand,
Expressions.constant(
requireNonNull(interval, "interval").timeUnitRange),
Expressions.constant(
interval.getFractionalSecondPrecision(
typeFactory.getTypeSystem()))));
case BOOLEAN:
return RexImpTable.optimize2(operand,
Expressions.call(BuiltInMethod.BOOLEAN_TO_STRING.method,
operand));
case BINARY:
case VARBINARY:
return RexImpTable.optimize2(
operand,
Expressions.call(IgniteMethod.BYTESTRING_TO_STRING.method(), operand));
default:
return defaultExpression.get();
}
default:
return defaultExpression.get();
}
}