blob: 1977119d994f154bbc2f49a360d9f4102649a25a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.flink.table.functions.sql
import org.apache.flink.table.api.Types
import org.apache.flink.table.calcite.FlinkTypeFactory
import org.apache.flink.table.calcite.`type`.{FlinkReturnTypes, NumericExceptFirstOperandChecker, RepeatFamilyOperandTypeChecker}
import org.apache.flink.table.dataformat.Decimal
import org.apache.calcite.rel.`type`.{RelDataType, RelDataTypeFactory, RelProtoDataType}
import org.apache.calcite.sql._
import org.apache.calcite.sql.`type`.{OperandTypes, ReturnTypes, SqlTypeFamily, _}
import org.apache.calcite.sql.validate.SqlMonotonicity
/**
* All built-in scalar SQL functions.
*/
object ScalarSqlFunctions {
private val VARCHAR_2000_NULLABLE =
ReturnTypes.cascade(ReturnTypes.VARCHAR_2000, SqlTypeTransforms.FORCE_NULLABLE)
private val ARG0_VARCHAR_NULLABLE: SqlReturnTypeInference = new OrdinalReturnTypeInference(0) {
override def inferReturnType(opBinding: SqlOperatorBinding): RelDataType = {
val `type` = super.inferReturnType(opBinding)
val newType = `type`.getSqlTypeName match {
case SqlTypeName.CHAR =>
opBinding.getTypeFactory.createSqlType(SqlTypeName.VARCHAR, `type`.getPrecision)
case SqlTypeName.VARCHAR => `type`
case _ => throw new UnsupportedOperationException(s"Unsupported type:${`type`}")
}
opBinding.getTypeFactory.createTypeWithNullability(newType, true)
}
}
private val FLINK_QUOTIENT_NULLABLE = new SqlReturnTypeInference() {
override def inferReturnType(opBinding: SqlOperatorBinding): RelDataType = {
val type1 = opBinding.getOperandType(0)
val type2 = opBinding.getOperandType(1)
if (SqlTypeUtil.isDecimal(type1) || SqlTypeUtil.isDecimal(type2)) {
ReturnTypes.QUOTIENT_NULLABLE.inferReturnType(opBinding)
} else {
val doubleType = opBinding.getTypeFactory.createSqlType(SqlTypeName.DOUBLE)
if (type1.isNullable || type2.isNullable) {
opBinding.getTypeFactory.createTypeWithNullability(doubleType, true)
} else {
doubleType
}
}
}
}
// see DivCallGen
private val FLINK_DIV_NULLABLE = new SqlReturnTypeInference() {
override def inferReturnType(opBinding: SqlOperatorBinding): RelDataType = {
val type1 = opBinding.getOperandType(0)
val type2 = opBinding.getOperandType(1)
val returnType =
if (SqlTypeUtil.isDecimal(type1) || SqlTypeUtil.isDecimal(type2)) {
val dt = Decimal.inferIntDivType(
type1.getPrecision, type1.getScale, type2.getPrecision, type2.getScale)
opBinding.getTypeFactory.createSqlType(SqlTypeName.DECIMAL, dt.precision, dt.scale)
} else { // both are primitive
type1
}
opBinding.getTypeFactory.createTypeWithNullability(returnType,
type1.isNullable || type2.isNullable)
}
}
/**
* Arithmetic division operator, '/'.
*/
val DIVIDE = new SqlBinaryOperator(
"/",
SqlKind.DIVIDE,
60,
true,
FLINK_QUOTIENT_NULLABLE,
InferTypes.FIRST_KNOWN,
OperandTypes.DIVISION_OPERATOR)
val E = new SqlFunction(
"E",
SqlKind.OTHER_FUNCTION,
ReturnTypes.DOUBLE,
null.asInstanceOf[SqlOperandTypeInference],
OperandTypes.NILADIC,
SqlFunctionCategory.NUMERIC)
val PI = new SqlFunction(
"PI",
SqlKind.OTHER_FUNCTION,
ReturnTypes.DOUBLE,
null.asInstanceOf[SqlOperandTypeInference],
OperandTypes.NILADIC,
SqlFunctionCategory.NUMERIC)
val CONCAT = new SqlFunction(
"CONCAT",
SqlKind.OTHER_FUNCTION,
ReturnTypes.cascade(ReturnTypes.explicit(SqlTypeName.VARCHAR), SqlTypeTransforms.TO_NULLABLE),
null.asInstanceOf[SqlOperandTypeInference],
new RepeatFamilyOperandTypeChecker(SqlTypeFamily.CHARACTER),
SqlFunctionCategory.STRING)
val CONCAT_WS = new SqlFunction(
"CONCAT_WS",
SqlKind.OTHER_FUNCTION,
ReturnTypes.cascade(ReturnTypes.explicit(SqlTypeName.VARCHAR), SqlTypeTransforms.TO_NULLABLE),
null.asInstanceOf[SqlOperandTypeInference],
new RepeatFamilyOperandTypeChecker(SqlTypeFamily.CHARACTER),
SqlFunctionCategory.STRING)
val LOG = new SqlFunction(
"LOG",
SqlKind.OTHER_FUNCTION,
ReturnTypes.DOUBLE_NULLABLE,
null.asInstanceOf[SqlOperandTypeInference],
OperandTypes.or(OperandTypes.NUMERIC,
OperandTypes.family(SqlTypeFamily.NUMERIC, SqlTypeFamily.NUMERIC)),
SqlFunctionCategory.NUMERIC)
val ROUND = new SqlFunction(
"ROUND",
SqlKind.OTHER_FUNCTION,
FlinkReturnTypes.ROUND_FUNCTION_NULLABLE,
null.asInstanceOf[SqlOperandTypeInference],
OperandTypes.or(OperandTypes.NUMERIC_INTEGER, OperandTypes.NUMERIC),
SqlFunctionCategory.NUMERIC)
val BIN = new SqlFunction(
"BIN",
SqlKind.OTHER_FUNCTION,
ReturnTypes.cascade(ReturnTypes.explicit(SqlTypeName.VARCHAR), SqlTypeTransforms.TO_NULLABLE),
InferTypes.RETURN_TYPE,
OperandTypes.family(SqlTypeFamily.INTEGER),
SqlFunctionCategory.NUMERIC)
val SINH = new SqlFunction(
"SINH",
SqlKind.OTHER_FUNCTION,
ReturnTypes.DOUBLE_NULLABLE,
null,
OperandTypes.NUMERIC,
SqlFunctionCategory.NUMERIC)
val HEX = new SqlFunction(
"HEX",
SqlKind.OTHER_FUNCTION,
ReturnTypes.cascade(ReturnTypes.explicit(SqlTypeName.VARCHAR), SqlTypeTransforms.TO_NULLABLE),
InferTypes.RETURN_TYPE,
OperandTypes.or(OperandTypes.family(SqlTypeFamily.INTEGER),
OperandTypes.family(SqlTypeFamily.STRING)),
SqlFunctionCategory.NUMERIC)
val BITAND = new SqlFunction(
"BITAND",
SqlKind.OTHER_FUNCTION,
ReturnTypes.ARG0_NULLABLE,
null.asInstanceOf[SqlOperandTypeInference],
OperandTypes.family(SqlTypeFamily.NUMERIC, SqlTypeFamily.NUMERIC),
SqlFunctionCategory.NUMERIC)
val BITOR = new SqlFunction(
"BITOR",
SqlKind.OTHER_FUNCTION,
ReturnTypes.ARG0_NULLABLE,
null.asInstanceOf[SqlOperandTypeInference],
OperandTypes.family(SqlTypeFamily.NUMERIC, SqlTypeFamily.NUMERIC),
SqlFunctionCategory.NUMERIC)
val BITXOR = new SqlFunction(
"BITXOR",
SqlKind.OTHER_FUNCTION,
ReturnTypes.ARG0_NULLABLE,
null.asInstanceOf[SqlOperandTypeInference],
OperandTypes.family(SqlTypeFamily.NUMERIC, SqlTypeFamily.NUMERIC),
SqlFunctionCategory.NUMERIC)
val BITNOT = new SqlFunction(
"BITNOT",
SqlKind.OTHER_FUNCTION,
ReturnTypes.ARG0_NULLABLE,
null.asInstanceOf[SqlOperandTypeInference],
OperandTypes.NUMERIC,
SqlFunctionCategory.NUMERIC)
val JSON_VALUE = new SqlFunction(
"JSON_VALUE",
SqlKind.OTHER_FUNCTION,
VARCHAR_2000_NULLABLE,
null,
OperandTypes.family(SqlTypeFamily.CHARACTER, SqlTypeFamily.CHARACTER),
SqlFunctionCategory.STRING)
val STR_TO_MAP = new SqlFunction(
"STR_TO_MAP",
SqlKind.OTHER_FUNCTION,
ReturnTypes.explicit(new RelProtoDataType {
override def apply(factory: RelDataTypeFactory): RelDataType =
factory.asInstanceOf[FlinkTypeFactory].createTypeFromTypeInfo(
Types.MAP(Types.STRING, Types.STRING),
isNullable = true)
}),
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING, SqlTypeFamily.STRING)
),
SqlFunctionCategory.STRING)
val LOG2 = new SqlFunction(
"LOG2",
SqlKind.OTHER_FUNCTION,
ReturnTypes.DOUBLE_NULLABLE,
null.asInstanceOf[SqlOperandTypeInference],
OperandTypes.NUMERIC,
SqlFunctionCategory.NUMERIC)
val IS_DECIMAL = new SqlFunction(
"IS_DECIMAL",
SqlKind.OTHER_FUNCTION,
ReturnTypes.BOOLEAN,
null.asInstanceOf[SqlOperandTypeInference],
OperandTypes.or(OperandTypes.CHARACTER, OperandTypes.NUMERIC),
SqlFunctionCategory.NUMERIC)
val IS_DIGIT = new SqlFunction(
"IS_DIGIT",
SqlKind.OTHER_FUNCTION,
ReturnTypes.BOOLEAN,
null,
OperandTypes.or(OperandTypes.CHARACTER, OperandTypes.NUMERIC),
SqlFunctionCategory.NUMERIC)
val IS_ALPHA = new SqlFunction(
"IS_ALPHA",
SqlKind.OTHER_FUNCTION,
ReturnTypes.BOOLEAN,
null,
OperandTypes.or(OperandTypes.CHARACTER, OperandTypes.NUMERIC),
SqlFunctionCategory.NUMERIC)
val COSH = new SqlFunction(
"COSH",
SqlKind.OTHER_FUNCTION,
ReturnTypes.DOUBLE_NULLABLE,
null,
OperandTypes.NUMERIC,
SqlFunctionCategory.NUMERIC)
val TANH = new SqlFunction(
"TANH",
SqlKind.OTHER_FUNCTION,
ReturnTypes.DOUBLE_NULLABLE,
null,
OperandTypes.NUMERIC,
SqlFunctionCategory.NUMERIC)
val CHR = new SqlFunction(
"CHR",
SqlKind.OTHER_FUNCTION,
VARCHAR_2000_NULLABLE,
null,
OperandTypes.family(SqlTypeFamily.INTEGER),
SqlFunctionCategory.STRING)
val LPAD = new SqlFunction(
"LPAD",
SqlKind.OTHER_FUNCTION,
VARCHAR_2000_NULLABLE,
null,
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.INTEGER, SqlTypeFamily.STRING),
SqlFunctionCategory.STRING)
val RPAD = new SqlFunction(
"RPAD",
SqlKind.OTHER_FUNCTION,
VARCHAR_2000_NULLABLE,
null,
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.INTEGER, SqlTypeFamily.STRING),
SqlFunctionCategory.STRING)
val REPEAT = new SqlFunction(
"REPEAT",
SqlKind.OTHER_FUNCTION,
VARCHAR_2000_NULLABLE,
null,
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.INTEGER),
SqlFunctionCategory.STRING)
val REVERSE = new SqlFunction(
"REVERSE",
SqlKind.OTHER_FUNCTION,
VARCHAR_2000_NULLABLE,
null,
OperandTypes.family(SqlTypeFamily.STRING),
SqlFunctionCategory.STRING)
val REPLACE = new SqlFunction(
"REPLACE",
SqlKind.OTHER_FUNCTION,
VARCHAR_2000_NULLABLE,
null,
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING, SqlTypeFamily.STRING),
SqlFunctionCategory.STRING
)
val SPLIT_INDEX = new SqlFunction(
"SPLIT_INDEX",
SqlKind.OTHER_FUNCTION,
VARCHAR_2000_NULLABLE,
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.INTEGER, SqlTypeFamily.INTEGER),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING, SqlTypeFamily.INTEGER)),
SqlFunctionCategory.STRING)
val REGEXP_REPLACE = new SqlFunction(
"REGEXP_REPLACE",
SqlKind.OTHER_FUNCTION,
VARCHAR_2000_NULLABLE,
null,
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING, SqlTypeFamily.STRING),
SqlFunctionCategory.STRING)
val REGEXP_EXTRACT = new SqlFunction(
"REGEXP_EXTRACT",
SqlKind.OTHER_FUNCTION,
VARCHAR_2000_NULLABLE,
null,
OperandTypes.or(OperandTypes.STRING_STRING_INTEGER,
OperandTypes.STRING_STRING
),
SqlFunctionCategory.STRING
)
val KEYVALUE = new SqlFunction(
"KEYVALUE",
SqlKind.OTHER_FUNCTION,
VARCHAR_2000_NULLABLE,
null,
OperandTypes.family(
SqlTypeFamily.STRING,
SqlTypeFamily.STRING,
SqlTypeFamily.STRING,
SqlTypeFamily.STRING),
SqlFunctionCategory.STRING)
val HASH_CODE = new SqlFunction(
"HASH_CODE",
SqlKind.OTHER_FUNCTION,
ReturnTypes.INTEGER_NULLABLE,
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.BOOLEAN),
OperandTypes.family(SqlTypeFamily.NUMERIC),
OperandTypes.family(SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.TIMESTAMP),
OperandTypes.family(SqlTypeFamily.TIME),
OperandTypes.family(SqlTypeFamily.DATE)),
SqlFunctionCategory.STRING)
val MD5 = new SqlFunction(
"MD5",
SqlKind.OTHER_FUNCTION,
ARG0_VARCHAR_NULLABLE,
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING)),
SqlFunctionCategory.STRING)
val SHA1 = new SqlFunction(
"SHA1",
SqlKind.OTHER_FUNCTION,
ARG0_VARCHAR_NULLABLE,
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING)),
SqlFunctionCategory.STRING)
val SHA224 = new SqlFunction(
"SHA224",
SqlKind.OTHER_FUNCTION,
ARG0_VARCHAR_NULLABLE,
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING)),
SqlFunctionCategory.STRING)
val SHA256 = new SqlFunction(
"SHA256",
SqlKind.OTHER_FUNCTION,
ARG0_VARCHAR_NULLABLE,
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING)),
SqlFunctionCategory.STRING)
val SHA384 = new SqlFunction(
"SHA384",
SqlKind.OTHER_FUNCTION,
ARG0_VARCHAR_NULLABLE,
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING)),
SqlFunctionCategory.STRING)
val SHA512 = new SqlFunction(
"SHA512",
SqlKind.OTHER_FUNCTION,
ARG0_VARCHAR_NULLABLE,
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING)),
SqlFunctionCategory.STRING)
val SHA2 = new SqlFunction(
"SHA2",
SqlKind.OTHER_FUNCTION,
ARG0_VARCHAR_NULLABLE,
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.INTEGER),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING, SqlTypeFamily.INTEGER)),
SqlFunctionCategory.STRING)
val DATE_FORMAT = new SqlFunction(
"DATE_FORMAT",
SqlKind.OTHER_FUNCTION,
ReturnTypes.cascade(ReturnTypes.explicit(SqlTypeName.VARCHAR), SqlTypeTransforms.TO_NULLABLE),
InferTypes.RETURN_TYPE,
OperandTypes.or(
OperandTypes.sequence("'(TIMESTAMP, FORMAT)'",
OperandTypes.DATETIME, OperandTypes.STRING),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING, SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING)),
SqlFunctionCategory.TIMEDATE
)
val REGEXP = new SqlFunction(
"REGEXP",
SqlKind.OTHER_FUNCTION,
ReturnTypes.BOOLEAN_NULLABLE,
null,
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING),
SqlFunctionCategory.STRING)
val PARSE_URL = new SqlFunction(
"PARSE_URL",
SqlKind.OTHER_FUNCTION,
VARCHAR_2000_NULLABLE,
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING, SqlTypeFamily.STRING)),
SqlFunctionCategory.STRING)
val PRINT = new SqlFunction(
"PRINT",
SqlKind.OTHER_FUNCTION,
ReturnTypes.ARG1_NULLABLE,
null,
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.ANY),
SqlFunctionCategory.STRING)
val NOW = new SqlFunction(
"NOW",
SqlKind.OTHER_FUNCTION,
ReturnTypes.BIGINT,
null,
OperandTypes.or(
OperandTypes.NILADIC,
OperandTypes.family(SqlTypeFamily.INTEGER)),
SqlFunctionCategory.TIMEDATE) {
override def isDeterministic: Boolean = false
override def getMonotonicity(call: SqlOperatorBinding): SqlMonotonicity = SqlMonotonicity
.INCREASING
}
val UNIX_TIMESTAMP = new SqlFunction(
"UNIX_TIMESTAMP",
SqlKind.OTHER_FUNCTION,
ReturnTypes.BIGINT_NULLABLE,
null,
OperandTypes.or(
OperandTypes.NILADIC,
OperandTypes.family(SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.TIMESTAMP)),
SqlFunctionCategory.TIMEDATE) {
override def isDeterministic: Boolean = false
override def getMonotonicity(call: SqlOperatorBinding): SqlMonotonicity = SqlMonotonicity
.INCREASING
}
val FROM_UNIXTIME = new SqlFunction(
"FROM_UNIXTIME",
SqlKind.OTHER_FUNCTION,
VARCHAR_2000_NULLABLE,
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.NUMERIC),
OperandTypes.family(SqlTypeFamily.NUMERIC, SqlTypeFamily.STRING)),
SqlFunctionCategory.TIMEDATE)
val DATEDIFF = new SqlFunction(
"DATEDIFF",
SqlKind.OTHER_FUNCTION,
ReturnTypes.INTEGER_NULLABLE,
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.TIMESTAMP, SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.TIMESTAMP, SqlTypeFamily.TIMESTAMP),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.TIMESTAMP),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING)),
SqlFunctionCategory.TIMEDATE)
val DATE_SUB = new SqlFunction(
"DATE_SUB",
SqlKind.OTHER_FUNCTION,
VARCHAR_2000_NULLABLE,
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.TIMESTAMP, SqlTypeFamily.INTEGER),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.INTEGER)),
SqlFunctionCategory.TIMEDATE)
val DATE_ADD = new SqlFunction(
"DATE_ADD",
SqlKind.OTHER_FUNCTION,
VARCHAR_2000_NULLABLE,
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.TIMESTAMP, SqlTypeFamily.INTEGER),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.INTEGER)),
SqlFunctionCategory.TIMEDATE)
val IF = new SqlFunction(
"IF",
SqlKind.OTHER_FUNCTION,
FlinkReturnTypes.NUMERIC_FROM_ARG1_DEFAULT1_NULLABLE,
null,
OperandTypes.or(
OperandTypes.and(
// cannot only use `family(BOOLEAN, NUMERIC, NUMERIC)` here,
// as we don't want non-numeric types to be implicitly casted to numeric types.
new NumericExceptFirstOperandChecker(3),
OperandTypes.family(SqlTypeFamily.BOOLEAN, SqlTypeFamily.NUMERIC, SqlTypeFamily.NUMERIC)
),
OperandTypes.family(SqlTypeFamily.BOOLEAN, SqlTypeFamily.STRING, SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.BOOLEAN, SqlTypeFamily.BOOLEAN, SqlTypeFamily.BOOLEAN),
OperandTypes.family(SqlTypeFamily.BOOLEAN, SqlTypeFamily.CHARACTER, SqlTypeFamily.CHARACTER),
OperandTypes.family(SqlTypeFamily.BOOLEAN, SqlTypeFamily.BINARY, SqlTypeFamily.BINARY),
OperandTypes.family(SqlTypeFamily.BOOLEAN, SqlTypeFamily.DATE, SqlTypeFamily.DATE),
OperandTypes.family(SqlTypeFamily.BOOLEAN, SqlTypeFamily.TIMESTAMP, SqlTypeFamily.TIMESTAMP),
OperandTypes.family(SqlTypeFamily.BOOLEAN, SqlTypeFamily.TIME, SqlTypeFamily.TIME)
),
SqlFunctionCategory.NUMERIC)
val DIV = new SqlFunction( // similar to SqlStdOperatorTable.MOD
"DIV",
SqlKind.OTHER_FUNCTION,
FLINK_DIV_NULLABLE,
null,
OperandTypes.EXACT_NUMERIC_EXACT_NUMERIC,
SqlFunctionCategory.NUMERIC)
val DIV_INT = new SqlFunction(
"DIV_INT",
SqlKind.OTHER_FUNCTION,
ReturnTypes.INTEGER_QUOTIENT_NULLABLE,
null,
OperandTypes.family(SqlTypeFamily.NUMERIC, SqlTypeFamily.NUMERIC),
SqlFunctionCategory.NUMERIC)
val TO_BASE64 = new SqlFunction(
"TO_BASE64",
SqlKind.OTHER_FUNCTION,
VARCHAR_2000_NULLABLE,
null,
OperandTypes.ANY,
SqlFunctionCategory.STRING)
val FROM_BASE64 = new SqlFunction(
"FROM_BASE64",
SqlKind.OTHER_FUNCTION,
ReturnTypes.cascade(ReturnTypes.explicit(SqlTypeName.BINARY), SqlTypeTransforms.TO_NULLABLE),
null,
OperandTypes.family(SqlTypeFamily.STRING),
SqlFunctionCategory.STRING)
val UUID = new SqlFunction(
"UUID",
SqlKind.OTHER_FUNCTION,
ReturnTypes.VARCHAR_2000,
null,
OperandTypes.or(
OperandTypes.NILADIC,
OperandTypes.ANY),
SqlFunctionCategory.STRING) {
override def isDeterministic: Boolean = false
// Calcite treat MONOTONIC as CLUSTERED collation(not a mathematic monotonic function)
override def getMonotonicity(call: SqlOperatorBinding): SqlMonotonicity =
SqlMonotonicity.MONOTONIC
}
val SUBSTRING = new SqlFunction(
"SUBSTRING",
SqlKind.OTHER_FUNCTION,
ARG0_VARCHAR_NULLABLE,
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.INTEGER),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.INTEGER, SqlTypeFamily.INTEGER)
),
SqlFunctionCategory.STRING)
val SUBSTR = new SqlFunction(
"SUBSTR",
SqlKind.OTHER_FUNCTION,
ARG0_VARCHAR_NULLABLE,
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.INTEGER),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.INTEGER, SqlTypeFamily.INTEGER)
),
SqlFunctionCategory.STRING)
val LEFT = new SqlFunction(
"LEFT",
SqlKind.OTHER_FUNCTION,
ARG0_VARCHAR_NULLABLE,
null,
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.INTEGER),
SqlFunctionCategory.STRING)
val RIGHT = new SqlFunction(
"RIGHT",
SqlKind.OTHER_FUNCTION,
ARG0_VARCHAR_NULLABLE,
null,
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.INTEGER),
SqlFunctionCategory.STRING)
val PROCTIME = new SqlFunction(
"PROCTIME",
SqlKind.OTHER_FUNCTION,
ReturnTypes.explicit(new RelProtoDataType {
override def apply(factory: RelDataTypeFactory): RelDataType =
factory.asInstanceOf[FlinkTypeFactory].createProctimeIndicatorType()
}),
null,
OperandTypes.NILADIC,
SqlFunctionCategory.TIMEDATE) {
override def isDeterministic = false
override def getMonotonicity(call: SqlOperatorBinding): SqlMonotonicity =
SqlMonotonicity.INCREASING
}
val TO_TIMESTAMP = new SqlFunction(
"TO_TIMESTAMP",
SqlKind.OTHER_FUNCTION,
ReturnTypes.cascade(ReturnTypes.explicit(SqlTypeName.TIMESTAMP), SqlTypeTransforms.TO_NULLABLE),
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.NUMERIC),
OperandTypes.family(SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING)),
SqlFunctionCategory.TIMEDATE)
val FROM_TIMESTAMP = new SqlFunction(
"FROM_TIMESTAMP",
SqlKind.OTHER_FUNCTION,
ReturnTypes.cascade(ReturnTypes.BIGINT, SqlTypeTransforms.TO_NULLABLE),
null,
OperandTypes.family(SqlTypeFamily.TIMESTAMP),
SqlFunctionCategory.TIMEDATE)
val TO_DATE = new SqlFunction(
"TO_DATE",
SqlKind.OTHER_FUNCTION,
ReturnTypes.cascade(ReturnTypes.explicit(SqlTypeName.DATE), SqlTypeTransforms.TO_NULLABLE),
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.NUMERIC),
OperandTypes.family(SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING)),
SqlFunctionCategory.TIMEDATE)
val TO_TIMESTAMP_TZ = new SqlFunction(
"TO_TIMESTAMP_TZ",
SqlKind.OTHER_FUNCTION,
ReturnTypes.cascade(ReturnTypes.explicit(SqlTypeName.TIMESTAMP), SqlTypeTransforms.TO_NULLABLE),
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING, SqlTypeFamily.STRING)),
SqlFunctionCategory.TIMEDATE)
val DATE_FORMAT_TZ = new SqlFunction(
"DATE_FORMAT_TZ",
SqlKind.OTHER_FUNCTION,
ReturnTypes.cascade(ReturnTypes.explicit(SqlTypeName.VARCHAR), SqlTypeTransforms.TO_NULLABLE),
InferTypes.RETURN_TYPE,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.TIMESTAMP, SqlTypeFamily.STRING, SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.TIMESTAMP, SqlTypeFamily.STRING)),
SqlFunctionCategory.TIMEDATE
)
val CONVERT_TZ = new SqlFunction(
"CONVERT_TZ",
SqlKind.OTHER_FUNCTION,
ReturnTypes.cascade(ReturnTypes.explicit(SqlTypeName.VARCHAR), SqlTypeTransforms.TO_NULLABLE),
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING, SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING,
SqlTypeFamily.STRING, SqlTypeFamily.STRING)),
SqlFunctionCategory.TIMEDATE)
val LOCATE = new SqlFunction(
"LOCATE",
SqlKind.OTHER_FUNCTION,
ReturnTypes.INTEGER_NULLABLE,
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING, SqlTypeFamily.INTEGER)),
SqlFunctionCategory.NUMERIC)
val LENGTH = new SqlFunction(
"LENGTH",
SqlKind.OTHER_FUNCTION,
ReturnTypes.INTEGER_NULLABLE,
null,
OperandTypes.family(SqlTypeFamily.STRING),
SqlFunctionCategory.NUMERIC)
val ASCII = new SqlFunction(
"ASCII",
SqlKind.OTHER_FUNCTION,
ReturnTypes.INTEGER_NULLABLE,
null,
OperandTypes.family(SqlTypeFamily.STRING),
SqlFunctionCategory.NUMERIC)
val ENCODE = new SqlFunction(
"ENCODE",
SqlKind.OTHER_FUNCTION,
ReturnTypes.cascade(ReturnTypes.explicit(SqlTypeName.BINARY), SqlTypeTransforms.FORCE_NULLABLE),
null,
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING),
SqlFunctionCategory.STRING)
val DECODE = new SqlFunction(
"DECODE",
SqlKind.OTHER_FUNCTION,
VARCHAR_2000_NULLABLE,
null,
OperandTypes.family(SqlTypeFamily.BINARY, SqlTypeFamily.STRING),
SqlFunctionCategory.STRING)
val INSTR = new SqlFunction(
"INSTR",
SqlKind.OTHER_FUNCTION,
ReturnTypes.INTEGER_NULLABLE,
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING, SqlTypeFamily.INTEGER),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING, SqlTypeFamily.INTEGER,
SqlTypeFamily.INTEGER)),
SqlFunctionCategory.NUMERIC)
val LTRIM = new SqlFunction(
"LTRIM",
SqlKind.OTHER_FUNCTION,
ARG0_VARCHAR_NULLABLE,
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING)),
SqlFunctionCategory.STRING)
val RTRIM = new SqlFunction(
"RTRIM",
SqlKind.OTHER_FUNCTION,
ARG0_VARCHAR_NULLABLE,
null,
OperandTypes.or(
OperandTypes.family(SqlTypeFamily.STRING),
OperandTypes.family(SqlTypeFamily.STRING, SqlTypeFamily.STRING)),
SqlFunctionCategory.STRING)
}