in flink-table/flink-table-planner-blink/src/main/scala/org/apache/flink/table/planner/typeutils/TypeCoercion.scala [68:118]
def canCast(
from: LogicalType, to: LogicalType): Boolean = (from.getTypeRoot, to.getTypeRoot) match {
case (_, _) if from == to => true
case (_, VARCHAR | CHAR) => true
case (VARCHAR | CHAR, _) if isNumeric(to) => true
case (VARCHAR | CHAR, BOOLEAN) => true
case (VARCHAR | CHAR, DECIMAL) => true
case (VARCHAR | CHAR, DATE) => true
case (VARCHAR | CHAR, TIME_WITHOUT_TIME_ZONE) => true
case (VARCHAR | CHAR, TIMESTAMP_WITHOUT_TIME_ZONE) => true
case (VARCHAR | CHAR, TIMESTAMP_WITH_LOCAL_TIME_ZONE) => true
case (BOOLEAN, _) if isNumeric(to) => true
case (BOOLEAN, DECIMAL) => true
case (_, BOOLEAN) if isNumeric(from) => true
case (DECIMAL, BOOLEAN) => true
case (_, _) if isNumeric(from) && isNumeric(to) => true
case (_, DECIMAL) if isNumeric(from) => true
case (DECIMAL, _) if isNumeric(to) => true
case (DECIMAL, DECIMAL) => true
case (INTEGER, DATE) => true
case (INTEGER, TIME_WITHOUT_TIME_ZONE) => true
case (TINYINT, TIMESTAMP_WITHOUT_TIME_ZONE) => true
case (SMALLINT, TIMESTAMP_WITHOUT_TIME_ZONE) => true
case (INTEGER, TIMESTAMP_WITHOUT_TIME_ZONE) => true
case (BIGINT, TIMESTAMP_WITHOUT_TIME_ZONE) => true
case (DOUBLE, TIMESTAMP_WITHOUT_TIME_ZONE) => true
case (FLOAT, TIMESTAMP_WITHOUT_TIME_ZONE) => true
case (INTEGER, INTERVAL_YEAR_MONTH) => true
case (BIGINT, INTERVAL_DAY_TIME) => true
case (DATE, TIME_WITHOUT_TIME_ZONE) => false
case (TIME_WITHOUT_TIME_ZONE, DATE) => false
case (_, _) if isTimePoint(from) && isTimePoint(to) => true
case (DATE, INTEGER) => true
case (TIME_WITHOUT_TIME_ZONE, INTEGER) => true
case (TIMESTAMP_WITHOUT_TIME_ZONE, TINYINT) => true
case (TIMESTAMP_WITHOUT_TIME_ZONE, INTEGER) => true
case (TIMESTAMP_WITHOUT_TIME_ZONE, SMALLINT) => true
case (TIMESTAMP_WITHOUT_TIME_ZONE, BIGINT) => true
case (TIMESTAMP_WITHOUT_TIME_ZONE, DOUBLE) => true
case (TIMESTAMP_WITHOUT_TIME_ZONE, FLOAT) => true
case (INTERVAL_YEAR_MONTH, INTEGER) => true
case (INTERVAL_DAY_TIME, BIGINT) => true
case _ => false
}