Search in sources :

Example 1 with ColumnMapping

use of io.prestosql.plugin.jdbc.ColumnMapping in project hetu-core by openlookeng.

the class MySqlClient method getColumns.

@SuppressWarnings("SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING")
@Override
public Map<String, ColumnHandle> getColumns(ConnectorSession session, String sql, Map<String, Type> types) {
    try (Connection connection = connectionFactory.openConnection(JdbcIdentity.from(session));
        PreparedStatement statement = connection.prepareStatement(sql)) {
        ResultSetMetaData metaData = statement.getMetaData();
        ImmutableMap.Builder<String, ColumnHandle> columnBuilder = new ImmutableMap.Builder<>();
        for (int i = 1; i <= metaData.getColumnCount(); i++) {
            String columnName = metaData.getColumnLabel(i);
            String typeName = metaData.getColumnTypeName(i);
            int precision = metaData.getPrecision(i);
            int dataType = metaData.getColumnType(i);
            int scale = metaData.getScale(i);
            // extracted from logical plan during pre-processing
            if (dataType == Types.DECIMAL && (precision > MAX_PRECISION || scale < 0)) {
                // Covert MySql Decimal type to Presto type
                Type type = types.get(columnName.toLowerCase(ENGLISH));
                if (type instanceof AbstractType) {
                    TypeSignature signature = type.getTypeSignature();
                    typeName = signature.getBase().toUpperCase(ENGLISH);
                    dataType = JDBCType.valueOf(typeName).getVendorTypeNumber();
                    if (type instanceof DecimalType) {
                        precision = ((DecimalType) type).getPrecision();
                        scale = ((DecimalType) type).getScale();
                    }
                }
            }
            boolean isNullable = metaData.isNullable(i) != ResultSetMetaData.columnNoNulls;
            JdbcTypeHandle typeHandle = new JdbcTypeHandle(dataType, Optional.ofNullable(typeName), precision, scale, Optional.empty());
            Optional<ColumnMapping> columnMapping;
            try {
                columnMapping = toPrestoType(session, connection, typeHandle);
            } catch (UnsupportedOperationException ex) {
                throw new PrestoException(JDBC_UNSUPPORTED_EXPRESSION, format("Data type [%s] is not support", typeHandle.getJdbcTypeName()));
            }
            // skip unsupported column types
            if (columnMapping.isPresent()) {
                Type type = columnMapping.get().getType();
                JdbcColumnHandle handle = new JdbcColumnHandle(columnName, typeHandle, type, isNullable);
                columnBuilder.put(columnName.toLowerCase(ENGLISH), handle);
            } else {
                return Collections.emptyMap();
            }
        }
        return columnBuilder.build();
    } catch (SQLException | PrestoException e) {
        throw new PrestoException(JDBC_QUERY_GENERATOR_FAILURE, String.format("Query generator failed for [%s]", e.getMessage()));
    }
}
Also used : JdbcColumnHandle(io.prestosql.plugin.jdbc.JdbcColumnHandle) ColumnHandle(io.prestosql.spi.connector.ColumnHandle) SQLException(java.sql.SQLException) Connection(java.sql.Connection) JdbcColumnHandle(io.prestosql.plugin.jdbc.JdbcColumnHandle) PreparedStatement(java.sql.PreparedStatement) PrestoException(io.prestosql.spi.PrestoException) ImmutableMap(com.google.common.collect.ImmutableMap) ResultSetMetaData(java.sql.ResultSetMetaData) Varchars.isVarcharType(io.prestosql.spi.type.Varchars.isVarcharType) DecimalType(io.prestosql.spi.type.DecimalType) Type(io.prestosql.spi.type.Type) AbstractType(io.prestosql.spi.type.AbstractType) JDBCType(java.sql.JDBCType) VarcharType(io.prestosql.spi.type.VarcharType) TypeSignature(io.prestosql.spi.type.TypeSignature) JdbcTypeHandle(io.prestosql.plugin.jdbc.JdbcTypeHandle) AbstractType(io.prestosql.spi.type.AbstractType) DecimalType(io.prestosql.spi.type.DecimalType) ColumnMapping(io.prestosql.plugin.jdbc.ColumnMapping)

Example 2 with ColumnMapping

use of io.prestosql.plugin.jdbc.ColumnMapping in project hetu-core by openlookeng.

the class GreenPlumSqlClient method getColumns.

@Override
public List<JdbcColumnHandle> getColumns(ConnectorSession session, JdbcTableHandle tableHandle) {
    try (Connection connection = connectionFactory.openConnection(JdbcIdentity.from(session))) {
        Map<String, Integer> arrayColumnDimensions = getArrayColumnDimensions(connection, tableHandle);
        try (ResultSet resultSet = getColumns(tableHandle, connection.getMetaData())) {
            List<JdbcColumnHandle> columns = new ArrayList<>();
            while (resultSet.next()) {
                String columnName = resultSet.getString("COLUMN_NAME");
                JdbcTypeHandle typeHandle = new JdbcTypeHandle(resultSet.getInt("DATA_TYPE"), Optional.of(resultSet.getString("TYPE_NAME")), resultSet.getInt("COLUMN_SIZE"), resultSet.getInt("DECIMAL_DIGITS"), Optional.ofNullable(arrayColumnDimensions.get(columnName)));
                Optional<ColumnMapping> columnMapping = toPrestoType(session, connection, typeHandle);
                // skip unsupported column types
                if (columnMapping.isPresent()) {
                    boolean nullable = (resultSet.getInt("NULLABLE") != columnNoNulls);
                    columns.add(new JdbcColumnHandle(columnName, typeHandle, columnMapping.get().getType(), nullable));
                }
            }
            if (columns.isEmpty()) {
                // In rare cases a table might have no columns.
                throw new TableNotFoundException(tableHandle.getSchemaTableName());
            }
            return ImmutableList.copyOf(columns);
        }
    } catch (SQLException e) {
        throw new PrestoException(JDBC_ERROR, e);
    }
}
Also used : SQLException(java.sql.SQLException) Connection(java.sql.Connection) PgConnection(org.postgresql.jdbc.PgConnection) JdbcColumnHandle(io.prestosql.plugin.jdbc.JdbcColumnHandle) ArrayList(java.util.ArrayList) PrestoException(io.prestosql.spi.PrestoException) TableNotFoundException(io.prestosql.spi.connector.TableNotFoundException) JdbcTypeHandle(io.prestosql.plugin.jdbc.JdbcTypeHandle) ResultSet(java.sql.ResultSet) StandardColumnMappings.timestampColumnMapping(io.prestosql.plugin.jdbc.StandardColumnMappings.timestampColumnMapping) ColumnMapping(io.prestosql.plugin.jdbc.ColumnMapping)

Example 3 with ColumnMapping

use of io.prestosql.plugin.jdbc.ColumnMapping in project hetu-core by openlookeng.

the class ClickHouseClient method getColumns.

@SuppressFBWarnings("SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING")
@Override
public Map<String, ColumnHandle> getColumns(ConnectorSession session, String sql, Map<String, Type> types) {
    try (Connection connection = connectionFactory.openConnection(JdbcIdentity.from(session));
        PreparedStatement statement = connection.prepareStatement(sql)) {
        ResultSetMetaData metadata = statement.getMetaData();
        ImmutableMap.Builder<String, ColumnHandle> builder = new ImmutableMap.Builder<>();
        for (int i = 1; i <= metadata.getColumnCount(); i++) {
            String columnName = metadata.getColumnLabel(i);
            String typeName = metadata.getColumnTypeName(i);
            int precision = metadata.getPrecision(i);
            int dataType = metadata.getColumnType(i);
            int scale = metadata.getScale(i);
            boolean isNullAble = metadata.isNullable(i) != ResultSetMetaData.columnNoNulls;
            if (dataType == Types.DECIMAL) {
                String loweredColumnName = columnName.toLowerCase(ENGLISH);
                Type type = types.get(loweredColumnName);
                if (type instanceof DecimalType) {
                    DecimalType decimalType = (DecimalType) type;
                    precision = decimalType.getPrecision();
                    scale = decimalType.getScale();
                }
            }
            JdbcTypeHandle typeHandle = new JdbcTypeHandle(dataType, Optional.ofNullable(typeName), precision, scale, Optional.empty());
            Optional<ColumnMapping> columnMapping;
            try {
                columnMapping = toPrestoType(session, connection, typeHandle);
            } catch (UnsupportedOperationException ex) {
                // User configured to fail the query if the data type is not supported
                return Collections.emptyMap();
            }
            // skip unsupported column types
            if (columnMapping.isPresent()) {
                Type type = columnMapping.get().getType();
                JdbcColumnHandle handle = new JdbcColumnHandle(columnName, typeHandle, type, isNullAble);
                builder.put(columnName.toLowerCase(ENGLISH), handle);
            } else {
                return Collections.emptyMap();
            }
        }
        return builder.build();
    } catch (SQLException | PrestoException e) {
        logger.error("in clickhouse push down, clickhouse data source error msg[%s] rewrite sql[%s]", e.getMessage(), sql);
        return Collections.emptyMap();
    }
}
Also used : JdbcColumnHandle(io.prestosql.plugin.jdbc.JdbcColumnHandle) ColumnHandle(io.prestosql.spi.connector.ColumnHandle) SQLException(java.sql.SQLException) Connection(java.sql.Connection) JdbcColumnHandle(io.prestosql.plugin.jdbc.JdbcColumnHandle) PreparedStatement(java.sql.PreparedStatement) PrestoException(io.prestosql.spi.PrestoException) ImmutableMap(com.google.common.collect.ImmutableMap) ResultSetMetaData(java.sql.ResultSetMetaData) Varchars.isVarcharType(io.prestosql.spi.type.Varchars.isVarcharType) DecimalType(io.prestosql.spi.type.DecimalType) Type(io.prestosql.spi.type.Type) VarcharType.createUnboundedVarcharType(io.prestosql.spi.type.VarcharType.createUnboundedVarcharType) CharType(io.prestosql.spi.type.CharType) JdbcTypeHandle(io.prestosql.plugin.jdbc.JdbcTypeHandle) DecimalType(io.prestosql.spi.type.DecimalType) StandardColumnMappings.tinyintColumnMapping(io.prestosql.plugin.jdbc.StandardColumnMappings.tinyintColumnMapping) StandardColumnMappings.varcharColumnMapping(io.prestosql.plugin.jdbc.StandardColumnMappings.varcharColumnMapping) StandardColumnMappings.smallintColumnMapping(io.prestosql.plugin.jdbc.StandardColumnMappings.smallintColumnMapping) ColumnMapping(io.prestosql.plugin.jdbc.ColumnMapping) StandardColumnMappings.integerColumnMapping(io.prestosql.plugin.jdbc.StandardColumnMappings.integerColumnMapping) StandardColumnMappings.bigintColumnMapping(io.prestosql.plugin.jdbc.StandardColumnMappings.bigintColumnMapping) SuppressFBWarnings(io.prestosql.spi.SuppressFBWarnings)

Example 4 with ColumnMapping

use of io.prestosql.plugin.jdbc.ColumnMapping in project hetu-core by openlookeng.

the class OracleClient method getColumns.

@SuppressFBWarnings("SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING")
@Override
public Map<String, ColumnHandle> getColumns(ConnectorSession session, String sql, Map<String, Type> types) {
    try (Connection connection = connectionFactory.openConnection(JdbcIdentity.from(session));
        PreparedStatement statement = connection.prepareStatement(sql)) {
        ResultSetMetaData metadata = statement.getMetaData();
        ImmutableMap.Builder<String, ColumnHandle> builder = new ImmutableMap.Builder<>();
        for (int i = 1; i <= metadata.getColumnCount(); i++) {
            String columnName = metadata.getColumnLabel(i);
            String typeName = metadata.getColumnTypeName(i);
            int precision = metadata.getPrecision(i);
            int dataType = metadata.getColumnType(i);
            int scale = metadata.getScale(i);
            boolean isNullAble = metadata.isNullable(i) != ResultSetMetaData.columnNoNulls;
            // the type of that column as integer.
            if ((dataType == Types.DECIMAL || NUMBER_DATA_TYPE_NAME.equalsIgnoreCase(typeName)) && (precision == 0 || scale < 0)) {
                // Covert Oracle NUMBER(scale) type to Presto types
                String loweredColumnName = columnName.toLowerCase(ENGLISH);
                Type hetuType = types.get(loweredColumnName);
                if (hetuType instanceof AbstractType) {
                    TypeSignature signature = hetuType.getTypeSignature();
                    typeName = signature.getBase().toUpperCase(ENGLISH);
                    dataType = JDBCType.valueOf(typeName).getVendorTypeNumber();
                    if (hetuType instanceof DecimalType && this.roundingMode != RoundingMode.UNNECESSARY) {
                        precision = ((DecimalType) hetuType).getPrecision();
                        scale = ((DecimalType) hetuType).getScale();
                    }
                }
            }
            JdbcTypeHandle typeHandle = new JdbcTypeHandle(dataType, Optional.ofNullable(typeName), precision, scale, Optional.empty());
            Optional<ColumnMapping> columnMapping;
            try {
                columnMapping = toPrestoType(session, connection, typeHandle);
            } catch (UnsupportedOperationException ex) {
                // User configured to fail the query if the data type is not supported
                return Collections.emptyMap();
            }
            // skip unsupported column types
            if (columnMapping.isPresent()) {
                Type type = columnMapping.get().getType();
                JdbcColumnHandle handle = new JdbcColumnHandle(columnName, typeHandle, type, isNullAble);
                builder.put(columnName.toLowerCase(ENGLISH), handle);
            }
        }
        return builder.build();
    } catch (SQLException | PrestoException e) {
        // Returning empty map will indicate that something wrong and let the Presto to execute the query as usual.
        return Collections.emptyMap();
    }
}
Also used : ColumnHandle(io.prestosql.spi.connector.ColumnHandle) JdbcColumnHandle(io.prestosql.plugin.jdbc.JdbcColumnHandle) SQLException(java.sql.SQLException) Connection(java.sql.Connection) JdbcColumnHandle(io.prestosql.plugin.jdbc.JdbcColumnHandle) PreparedStatement(java.sql.PreparedStatement) PrestoException(io.prestosql.spi.PrestoException) ImmutableMap(com.google.common.collect.ImmutableMap) ResultSetMetaData(java.sql.ResultSetMetaData) VarcharType.createVarcharType(io.prestosql.spi.type.VarcharType.createVarcharType) AbstractType(io.prestosql.spi.type.AbstractType) CharType(io.prestosql.spi.type.CharType) JDBCType(java.sql.JDBCType) VarcharType(io.prestosql.spi.type.VarcharType) DecimalType(io.prestosql.spi.type.DecimalType) Type(io.prestosql.spi.type.Type) DecimalType.createDecimalType(io.prestosql.spi.type.DecimalType.createDecimalType) CharType.createCharType(io.prestosql.spi.type.CharType.createCharType) VarcharType.createUnboundedVarcharType(io.prestosql.spi.type.VarcharType.createUnboundedVarcharType) TypeSignature(io.prestosql.spi.type.TypeSignature) JdbcTypeHandle(io.prestosql.plugin.jdbc.JdbcTypeHandle) AbstractType(io.prestosql.spi.type.AbstractType) DecimalType(io.prestosql.spi.type.DecimalType) DecimalType.createDecimalType(io.prestosql.spi.type.DecimalType.createDecimalType) StandardColumnMappings.tinyintColumnMapping(io.prestosql.plugin.jdbc.StandardColumnMappings.tinyintColumnMapping) StandardColumnMappings.smallintColumnMapping(io.prestosql.plugin.jdbc.StandardColumnMappings.smallintColumnMapping) StandardColumnMappings.bigintColumnMapping(io.prestosql.plugin.jdbc.StandardColumnMappings.bigintColumnMapping) StandardColumnMappings.varbinaryColumnMapping(io.prestosql.plugin.jdbc.StandardColumnMappings.varbinaryColumnMapping) StandardColumnMappings.realColumnMapping(io.prestosql.plugin.jdbc.StandardColumnMappings.realColumnMapping) StandardColumnMappings.doubleColumnMapping(io.prestosql.plugin.jdbc.StandardColumnMappings.doubleColumnMapping) StandardColumnMappings.varcharColumnMapping(io.prestosql.plugin.jdbc.StandardColumnMappings.varcharColumnMapping) ColumnMapping(io.prestosql.plugin.jdbc.ColumnMapping) StandardColumnMappings.integerColumnMapping(io.prestosql.plugin.jdbc.StandardColumnMappings.integerColumnMapping) SuppressFBWarnings(io.prestosql.spi.SuppressFBWarnings)

Example 5 with ColumnMapping

use of io.prestosql.plugin.jdbc.ColumnMapping in project hetu-core by openlookeng.

the class HanaClient method toPrestoType.

@Override
public Optional<ColumnMapping> toPrestoType(ConnectorSession session, Connection connection, JdbcTypeHandle typeHandle) {
    // web address, can not change it
    // CHECKSTYLE:OFF:LineLength
    // https://help.sap.com/viewer/4fe29514fd584807ac9f2a04f6754767/2.0.03/en-US/20a1569875191014b507cf392724b7eb.html
    // CHECKSTYLE:ON:LineLength
    Optional<ColumnMapping> columnMapping;
    int columnSize = typeHandle.getColumnSize();
    switch(typeHandle.getJdbcType()) {
        case Types.DECIMAL:
            int decimalDigits = typeHandle.getDecimalDigits();
            // Map decimal(p, -s) (negative scale) to
            // decimal(p+s, 0).
            int precision = columnSize + max(-decimalDigits, 0);
            if (precision > Decimals.MAX_PRECISION) {
                columnMapping = Optional.empty();
                break;
            }
            DecimalType decimalType = createDecimalType(precision, max(decimalDigits, 0));
            if (precision == HANA_SMALLDECIMAL_DEFAULT_SCALE && decimalType.getScale() == 0) {
                // hana smalldecimal type, or decimal p==HANA_SMALLDECIMAL_DEFAULT_SCALE, s==0
                columnMapping = Optional.of(hanaSmallDecimalColumnMapping());
                break;
            } else {
                columnMapping = super.toPrestoType(session, connection, typeHandle);
                break;
            }
        default:
            columnMapping = super.toPrestoType(session, connection, typeHandle);
    }
    return columnMapping;
}
Also used : DecimalType(io.prestosql.spi.type.DecimalType) DecimalType.createDecimalType(io.prestosql.spi.type.DecimalType.createDecimalType) ColumnMapping(io.prestosql.plugin.jdbc.ColumnMapping)

Aggregations

ColumnMapping (io.prestosql.plugin.jdbc.ColumnMapping)8 JdbcColumnHandle (io.prestosql.plugin.jdbc.JdbcColumnHandle)7 JdbcTypeHandle (io.prestosql.plugin.jdbc.JdbcTypeHandle)7 PrestoException (io.prestosql.spi.PrestoException)7 Connection (java.sql.Connection)7 SQLException (java.sql.SQLException)7 ImmutableMap (com.google.common.collect.ImmutableMap)5 ColumnHandle (io.prestosql.spi.connector.ColumnHandle)5 DecimalType (io.prestosql.spi.type.DecimalType)5 Type (io.prestosql.spi.type.Type)5 PreparedStatement (java.sql.PreparedStatement)5 ResultSetMetaData (java.sql.ResultSetMetaData)5 SuppressFBWarnings (io.prestosql.spi.SuppressFBWarnings)3 DecimalType.createDecimalType (io.prestosql.spi.type.DecimalType.createDecimalType)3 VarcharType (io.prestosql.spi.type.VarcharType)3 PgConnection (org.postgresql.jdbc.PgConnection)3 StandardColumnMappings.bigintColumnMapping (io.prestosql.plugin.jdbc.StandardColumnMappings.bigintColumnMapping)2 StandardColumnMappings.integerColumnMapping (io.prestosql.plugin.jdbc.StandardColumnMappings.integerColumnMapping)2 StandardColumnMappings.smallintColumnMapping (io.prestosql.plugin.jdbc.StandardColumnMappings.smallintColumnMapping)2 StandardColumnMappings.timestampColumnMapping (io.prestosql.plugin.jdbc.StandardColumnMappings.timestampColumnMapping)2