public DataType mapping()

in flink-connector-jdbc-oceanbase/src/main/java/org/apache/flink/connector/jdbc/oceanbase/database/catalog/OceanBaseTypeMapper.java [50:118]


    public DataType mapping(ObjectPath tablePath, ResultSetMetaData metadata, int colIndex)
            throws SQLException {
        String typeName = metadata.getColumnTypeName(colIndex).toUpperCase();
        int jdbcType = metadata.getColumnType(colIndex);
        String columnName = metadata.getColumnName(colIndex);
        int precision = metadata.getPrecision(colIndex);
        int scale = metadata.getScale(colIndex);
        switch (jdbcType) {
            case Types.BIT:
                return DataTypes.BOOLEAN();
            case Types.TINYINT:
                return isUnsignedType(typeName) || precision > 4
                        ? DataTypes.SMALLINT()
                        : DataTypes.TINYINT();
            case Types.SMALLINT:
                return isUnsignedType(typeName) ? DataTypes.INT() : DataTypes.SMALLINT();
            case Types.INTEGER:
                return !typeName.toUpperCase().startsWith("MEDIUMINT") && isUnsignedType(typeName)
                        ? DataTypes.BIGINT()
                        : DataTypes.INT();
            case Types.BIGINT:
                return isUnsignedType(typeName) ? DataTypes.DECIMAL(20, 0) : DataTypes.BIGINT();
            case Types.FLOAT:
            case Types.NUMERIC:
            case Types.DECIMAL:
                if (compatibleMode.isMySQLMode()) {
                    return isUnsignedType(typeName)
                            ? getDecimalType(precision + 1, scale)
                            : getDecimalType(precision, scale);
                }
                return getNumericType(precision, scale);
            case Types.REAL:
            case TYPE_BINARY_FLOAT:
                return DataTypes.FLOAT();
            case Types.DOUBLE:
            case TYPE_BINARY_DOUBLE:
                return DataTypes.DOUBLE();
            case Types.DATE:
                return "YEAR".equals(typeName) ? DataTypes.INT() : DataTypes.DATE();
            case Types.TIME:
                return isExplicitPrecision(precision, RAW_TIME_LENGTH)
                        ? DataTypes.TIME(precision - RAW_TIME_LENGTH - 1)
                        : DataTypes.TIME(0);
            case Types.TIMESTAMP:
                return typeName.equalsIgnoreCase("DATE")
                        ? DataTypes.DATE()
                        : isExplicitPrecision(precision, RAW_TIMESTAMP_LENGTH)
                                ? DataTypes.TIMESTAMP(precision - RAW_TIMESTAMP_LENGTH - 1)
                                : DataTypes.TIMESTAMP(0);
            case Types.CHAR:
            case Types.NCHAR:
                return DataTypes.CHAR(precision);
            case Types.VARCHAR:
            case Types.NVARCHAR:
            case Types.LONGVARCHAR:
                return precision > 0 ? DataTypes.VARCHAR(precision) : DataTypes.STRING();
            case Types.CLOB:
                return DataTypes.STRING();
            case Types.BINARY:
            case Types.VARBINARY:
            case Types.LONGVARBINARY:
            case Types.BLOB:
                return DataTypes.BYTES();
            default:
                throw new UnsupportedOperationException(
                        String.format(
                                "Doesn't support type '%s' on column '%s'.", typeName, columnName));
        }
    }