Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ jobs:
- :presto-mongodb -P ci-full-tests
- :presto-redis -P ci-full-tests
- :presto-elasticsearch
- :presto-oracle -P ci
- :presto-orc
- :presto-thrift-connector
- :presto-spark-base -P presto-spark-tests-smoke
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,10 @@

import com.facebook.airlift.log.Logger;
import com.facebook.presto.common.predicate.TupleDomain;
import com.facebook.presto.common.type.CharType;
import com.facebook.presto.common.type.DecimalType;
import com.facebook.presto.common.type.Decimals;
import com.facebook.presto.common.type.Type;
import com.facebook.presto.common.type.VarcharType;
import com.facebook.presto.plugin.jdbc.BaseJdbcClient;
import com.facebook.presto.plugin.jdbc.BaseJdbcConfig;
Expand All @@ -36,6 +39,7 @@
import com.facebook.presto.spi.statistics.TableStatistics;
import com.google.common.collect.Maps;
import jakarta.inject.Inject;
import oracle.jdbc.OracleTypes;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
Expand All @@ -49,15 +53,24 @@
import java.util.Map;
import java.util.Optional;

import static com.facebook.presto.common.type.BigintType.BIGINT;
import static com.facebook.presto.common.type.BooleanType.BOOLEAN;
import static com.facebook.presto.common.type.DateType.DATE;
import static com.facebook.presto.common.type.DecimalType.createDecimalType;
import static com.facebook.presto.common.type.DoubleType.DOUBLE;
import static com.facebook.presto.common.type.IntegerType.INTEGER;
import static com.facebook.presto.common.type.RealType.REAL;
import static com.facebook.presto.common.type.TimestampType.TIMESTAMP;
import static com.facebook.presto.common.type.VarcharType.createUnboundedVarcharType;
import static com.facebook.presto.common.type.VarcharType.createVarcharType;
import static com.facebook.presto.common.type.Varchars.isVarcharType;
import static com.facebook.presto.plugin.jdbc.JdbcErrorCode.JDBC_ERROR;
import static com.facebook.presto.plugin.jdbc.mapping.StandardColumnMappings.bigintReadMapping;
import static com.facebook.presto.plugin.jdbc.mapping.StandardColumnMappings.decimalReadMapping;
import static com.facebook.presto.plugin.jdbc.mapping.StandardColumnMappings.doubleReadMapping;
import static com.facebook.presto.plugin.jdbc.mapping.StandardColumnMappings.realReadMapping;
import static com.facebook.presto.plugin.jdbc.mapping.StandardColumnMappings.smallintReadMapping;
import static com.facebook.presto.plugin.jdbc.mapping.StandardColumnMappings.timestampReadMapping;
import static com.facebook.presto.plugin.jdbc.mapping.StandardColumnMappings.varbinaryReadMapping;
import static com.facebook.presto.plugin.jdbc.mapping.StandardColumnMappings.varcharReadMapping;
import static com.facebook.presto.spi.StandardErrorCode.NOT_SUPPORTED;
Expand Down Expand Up @@ -257,13 +270,15 @@ public Optional<ReadMapping> toPrestoType(ConnectorSession session, JdbcTypeHand

switch (typeHandle.getJdbcType()) {
case Types.CLOB:
case Types.NCLOB:
return Optional.of(varcharReadMapping(createUnboundedVarcharType()));
case Types.BLOB:
return Optional.of(varbinaryReadMapping());
case Types.SMALLINT:
return Optional.of(smallintReadMapping());
case Types.FLOAT:
case Types.DOUBLE:
case OracleTypes.BINARY_DOUBLE:
return Optional.of(doubleReadMapping());
case Types.REAL:
return Optional.of(realReadMapping());
Expand All @@ -286,10 +301,64 @@ public Optional<ReadMapping> toPrestoType(ConnectorSession session, JdbcTypeHand
return Optional.of(varcharReadMapping(createVarcharType(columnSize)));
case Types.VARCHAR:
return Optional.of(varcharReadMapping(createVarcharType(columnSize)));

/* Note: In Oracle, DATE and TIMESTAMP values are internally stored in the format YYYYMMDD HH24MISS.
* When reading from Oracle to Presto, TIMESTAMP mappings must be used to interpret the values correctly.
* Official documentation: https://docs.oracle.com/en/database/oracle/oracle-database/26/nlspg/datetime-data-types-and-time-zone-support.html#GUID-4D95F6B2-8F28-458A-820D-6C05F848CA23 */
case Types.DATE:
case Types.TIMESTAMP:
return Optional.of(timestampReadMapping());
}
return super.toPrestoType(session, typeHandle);
}

@Override
protected String toSqlType(Type type)
{
if (isVarcharType(type)) {
VarcharType varcharType = (VarcharType) type;
if (varcharType.isUnbounded() || varcharType.getLengthSafe() > 1000) {
return "NCLOB";
}
return format("VARCHAR2(%s CHAR)", varcharType.getLengthSafe());
}
if (type instanceof CharType) {
CharType charType = (CharType) type;
if (charType.getLength() > 500) {
return "CLOB";
}
return format("CHAR(%s)", ((CharType) type).getLength());
}
if (type instanceof DecimalType) {
return format("NUMBER(%s, %s)",
((DecimalType) type).getPrecision(),
((DecimalType) type).getScale());
}

if (BIGINT.equals(type)) {
return "NUMBER(19)";
}
if (INTEGER.equals(type)) {
return "NUMBER(10)";
}
if (DOUBLE.equals(type)) {
return "BINARY_DOUBLE";
}
if (REAL.equals(type)) {
return "BINARY_FLOAT";
}
if (BOOLEAN.equals(type)) {
return "NUMBER(1)";
}
if (DATE.equals(type)) {
return "DATE";
}
if (TIMESTAMP.equals(type)) {
return "TIMESTAMP";
}
return super.toSqlType(type);
}

@Override
public String normalizeIdentifier(ConnectorSession session, String identifier)
{
Expand Down

This file was deleted.

Loading
Loading