private SeaTunnelDataType getFunctionType()

in seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLType.java [369:519]


    private SeaTunnelDataType<?> getFunctionType(Function function) {
        switch (function.getName().toUpperCase()) {
            case ZetaSQLFunction.CHAR:
            case ZetaSQLFunction.CHR:
            case ZetaSQLFunction.CONCAT:
            case ZetaSQLFunction.CONCAT_WS:
            case ZetaSQLFunction.HEXTORAW:
            case ZetaSQLFunction.RAWTOHEX:
            case ZetaSQLFunction.INSERT:
            case ZetaSQLFunction.LOWER:
            case ZetaSQLFunction.LCASE:
            case ZetaSQLFunction.UPPER:
            case ZetaSQLFunction.UCASE:
            case ZetaSQLFunction.LEFT:
            case ZetaSQLFunction.RIGHT:
            case ZetaSQLFunction.LPAD:
            case ZetaSQLFunction.RPAD:
            case ZetaSQLFunction.LTRIM:
            case ZetaSQLFunction.RTRIM:
            case ZetaSQLFunction.TRIM:
            case ZetaSQLFunction.REGEXP_REPLACE:
            case ZetaSQLFunction.REGEXP_SUBSTR:
            case ZetaSQLFunction.REPEAT:
            case ZetaSQLFunction.REPLACE:
            case ZetaSQLFunction.SOUNDEX:
            case ZetaSQLFunction.SPACE:
            case ZetaSQLFunction.SUBSTRING:
            case ZetaSQLFunction.SUBSTR:
            case ZetaSQLFunction.TO_CHAR:
            case ZetaSQLFunction.TRANSLATE:
            case ZetaSQLFunction.DAYNAME:
            case ZetaSQLFunction.MONTHNAME:
            case ZetaSQLFunction.FORMATDATETIME:
            case ZetaSQLFunction.FROM_UNIXTIME:
            case ZetaSQLFunction.UUID:
                return BasicType.STRING_TYPE;
            case ZetaSQLFunction.ASCII:
            case ZetaSQLFunction.LOCATE:
            case ZetaSQLFunction.INSTR:
            case ZetaSQLFunction.POSITION:
            case ZetaSQLFunction.CEIL:
            case ZetaSQLFunction.CEILING:
            case ZetaSQLFunction.FLOOR:
            case ZetaSQLFunction.DAY_OF_MONTH:
            case ZetaSQLFunction.DAY_OF_WEEK:
            case ZetaSQLFunction.DAY_OF_YEAR:
            case ZetaSQLFunction.EXTRACT:
            case ZetaSQLFunction.HOUR:
            case ZetaSQLFunction.MINUTE:
            case ZetaSQLFunction.MONTH:
            case ZetaSQLFunction.QUARTER:
            case ZetaSQLFunction.SECOND:
            case ZetaSQLFunction.WEEK:
            case ZetaSQLFunction.YEAR:
            case ZetaSQLFunction.SIGN:
                return BasicType.INT_TYPE;
            case ZetaSQLFunction.BIT_LENGTH:
            case ZetaSQLFunction.CHAR_LENGTH:
            case ZetaSQLFunction.LENGTH:
            case ZetaSQLFunction.OCTET_LENGTH:
            case ZetaSQLFunction.DATEDIFF:
                return BasicType.LONG_TYPE;
            case ZetaSQLFunction.REGEXP_LIKE:
            case ZetaSQLFunction.IS_DATE:
                return BasicType.BOOLEAN_TYPE;
            case ZetaSQLFunction.ACOS:
            case ZetaSQLFunction.ASIN:
            case ZetaSQLFunction.ATAN:
            case ZetaSQLFunction.COS:
            case ZetaSQLFunction.COSH:
            case ZetaSQLFunction.COT:
            case ZetaSQLFunction.SIN:
            case ZetaSQLFunction.SINH:
            case ZetaSQLFunction.TAN:
            case ZetaSQLFunction.TANH:
            case ZetaSQLFunction.ATAN2:
            case ZetaSQLFunction.EXP:
            case ZetaSQLFunction.LN:
            case ZetaSQLFunction.LOG:
            case ZetaSQLFunction.LOG10:
            case ZetaSQLFunction.RADIANS:
            case ZetaSQLFunction.SQRT:
            case ZetaSQLFunction.PI:
            case ZetaSQLFunction.POWER:
            case ZetaSQLFunction.RAND:
            case ZetaSQLFunction.RANDOM:
            case ZetaSQLFunction.TRUNC:
            case ZetaSQLFunction.TRUNCATE:
                return BasicType.DOUBLE_TYPE;
            case ZetaSQLFunction.ARRAY:
                return ArrayFunction.castArrayTypeMapping(function, inputRowType);
            case ZetaSQLFunction.ARRAY_MAX:
            case ZetaSQLFunction.ARRAY_MIN:
                return ArrayFunction.getElementType(function, inputRowType);
            case ZetaSQLFunction.SPLIT:
                return ArrayType.STRING_ARRAY_TYPE;
            case ZetaSQLFunction.NOW:
            case ZetaSQLFunction.DATE_TRUNC:
                return LocalTimeType.LOCAL_DATE_TIME_TYPE;
            case ZetaSQLFunction.PARSEDATETIME:
            case ZetaSQLFunction.TO_DATE:
                {
                    String format = function.getParameters().getExpressions().get(1).toString();
                    if (format.contains("yy") && format.contains("mm")) {
                        return LocalTimeType.LOCAL_DATE_TIME_TYPE;
                    }
                    if (format.contains("yy")) {
                        return LocalTimeType.LOCAL_DATE_TYPE;
                    }
                    if (format.contains("mm")) {
                        return LocalTimeType.LOCAL_TIME_TYPE;
                    }
                    throw new TransformException(
                            CommonErrorCodeDeprecated.UNSUPPORTED_OPERATION,
                            String.format(
                                    "Unknown pattern letter %s for function: %s",
                                    format, function.getName()));
                }
            case ZetaSQLFunction.ABS:
            case ZetaSQLFunction.DATEADD:
            case ZetaSQLFunction.TIMESTAMPADD:
            case ZetaSQLFunction.ROUND:
            case ZetaSQLFunction.NULLIF:
            case ZetaSQLFunction.COALESCE:
            case ZetaSQLFunction.IFNULL:
                // Result has the same type as first argument
                return getExpressionType(function.getParameters().getExpressions().get(0));
            case ZetaSQLFunction.MOD:
                // Result has the same type as second argument
                return getExpressionType(function.getParameters().getExpressions().get(1));
            default:
                for (ZetaUDF udf : udfList) {
                    if (udf.functionName().equalsIgnoreCase(function.getName())) {
                        List<SeaTunnelDataType<?>> argsType = new ArrayList<>();
                        ExpressionList expressionList = function.getParameters();
                        if (expressionList != null) {
                            List<Expression> expressions = expressionList.getExpressions();
                            if (expressions != null) {
                                for (Expression expression : expressions) {
                                    argsType.add(getExpressionType(expression));
                                }
                            }
                        }
                        return udf.resultType(argsType);
                    }
                }
                throw new TransformException(
                        CommonErrorCodeDeprecated.UNSUPPORTED_OPERATION,
                        String.format("Unsupported function: %s ", function.getName()));
        }
    }