Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import com.google.cloud.bigquery.TableDefinition;
import com.google.cloud.bigquery.TableId;
import com.google.cloud.bigquery.exception.BigQueryJdbcException;
import com.google.common.collect.ImmutableMap;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
Expand All @@ -59,6 +60,7 @@
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Scanner;
import java.util.Set;
Expand Down Expand Up @@ -1650,8 +1652,8 @@ ColumnTypeInfo determineTypeInfoFromDataType(
String columnName,
int ordinalPosition) {

ColumnTypeInfo defaultVarcharTypeInfo =
new ColumnTypeInfo(Types.VARCHAR, "VARCHAR", null, null, null);
ColumnTypeInfo defaultStringTypeInfo =
new ColumnTypeInfo(Types.NVARCHAR, "STRING", null, null, null);
try {
String typeKind = argumentDataType.getTypeKind();
if (typeKind != null && !typeKind.isEmpty()) {
Expand All @@ -1664,10 +1666,10 @@ ColumnTypeInfo determineTypeInfoFromDataType(
} catch (Exception e) {
LOG.warning(
"Proc: %s, Arg: %s (Pos %d) - Caught an unexpected Exception during type"
+ " determination. Defaulting type to VARCHAR. Error: %s",
+ " determination. Defaulting type to STRING. Error: %s",
procedureName, columnName, ordinalPosition, e.getMessage());
}
return defaultVarcharTypeInfo;
return defaultStringTypeInfo;
}

Comparator<FieldValueList> defineGetProcedureColumnsComparator(FieldList resultSchemaFields) {
Expand Down Expand Up @@ -4750,13 +4752,16 @@ public boolean generatedKeyAlwaysReturned() {
}

@Override
public <T> T unwrap(Class<T> iface) {
return null;
public <T> T unwrap(Class<T> iface) throws SQLException {
if (iface.isInstance(this)) {
return iface.cast(this);
}
throw new SQLException("Cannot unwrap to " + iface.getName());
}

@Override
public boolean isWrapperFor(Class<?> iface) {
return false;
public boolean isWrapperFor(Class<?> iface) throws SQLException {
return iface != null && iface.isInstance(this);
}

// --- Helper Methods ---
Expand Down Expand Up @@ -4828,47 +4833,58 @@ private Tuple<String, String> determineEffectiveCatalogAndSchema(
return Tuple.of(effectiveCatalog, effectiveSchemaPattern);
}

// BigQuery STRING represents Unicode character strings (UTF-8).
// Standard JDBC maps UTF-8/Unicode data to Types.NVARCHAR rather than Types.VARCHAR.
private static final Map<StandardSQLTypeName, ColumnTypeInfo> STANDARD_TYPE_INFO =
Comment thread
Neenu1995 marked this conversation as resolved.
ImmutableMap.<StandardSQLTypeName, ColumnTypeInfo>builder()
.put(StandardSQLTypeName.INT64, new ColumnTypeInfo(Types.BIGINT, "INT64", 19, 0, 10))
.put(StandardSQLTypeName.BOOL, new ColumnTypeInfo(Types.BOOLEAN, "BOOL", 1, null, null))
.put(
StandardSQLTypeName.FLOAT64,
new ColumnTypeInfo(Types.DOUBLE, "FLOAT64", 15, null, 10))
.put(StandardSQLTypeName.NUMERIC, new ColumnTypeInfo(Types.NUMERIC, "NUMERIC", 38, 9, 10))
.put(
StandardSQLTypeName.BIGNUMERIC,
new ColumnTypeInfo(Types.NUMERIC, "BIGNUMERIC", 77, 38, 10))
.put(
StandardSQLTypeName.STRING,
new ColumnTypeInfo(Types.NVARCHAR, "STRING", null, null, null))
.put(
StandardSQLTypeName.TIMESTAMP,
new ColumnTypeInfo(Types.TIMESTAMP, "TIMESTAMP", 29, null, null))
.put(
StandardSQLTypeName.DATETIME,
new ColumnTypeInfo(Types.TIMESTAMP, "DATETIME", 29, null, null))
.put(StandardSQLTypeName.DATE, new ColumnTypeInfo(Types.DATE, "DATE", 10, null, null))
.put(StandardSQLTypeName.TIME, new ColumnTypeInfo(Types.TIME, "TIME", 15, null, null))
.put(
StandardSQLTypeName.GEOGRAPHY,
new ColumnTypeInfo(Types.OTHER, "GEOGRAPHY", null, null, null))
.put(StandardSQLTypeName.JSON, new ColumnTypeInfo(Types.OTHER, "JSON", null, null, null))
.put(
StandardSQLTypeName.INTERVAL,
new ColumnTypeInfo(Types.OTHER, "INTERVAL", null, null, null))
.put(
StandardSQLTypeName.RANGE, new ColumnTypeInfo(Types.OTHER, "RANGE", null, null, null))
.put(
StandardSQLTypeName.BYTES,
new ColumnTypeInfo(Types.VARBINARY, "BYTES", null, null, null))
.put(
StandardSQLTypeName.STRUCT,
new ColumnTypeInfo(Types.STRUCT, "STRUCT", null, null, null))
.build();

private ColumnTypeInfo getColumnTypeInfoForSqlType(StandardSQLTypeName bqType) {
if (bqType == null) {
LOG.warning("Null BigQuery type encountered: " + bqType.name() + ". Mapping to VARCHAR.");
return new ColumnTypeInfo(Types.VARCHAR, bqType.name(), null, null, null);
LOG.warning("Null BigQuery type encountered. Mapping to STRING.");
return new ColumnTypeInfo(Types.NVARCHAR, "STRING", null, null, null);
}

switch (bqType) {
case INT64:
return new ColumnTypeInfo(Types.BIGINT, "BIGINT", 19, 0, 10);
case BOOL:
return new ColumnTypeInfo(Types.BOOLEAN, "BOOLEAN", 1, null, null);
case FLOAT64:
return new ColumnTypeInfo(Types.DOUBLE, "DOUBLE", 15, null, 10);
case NUMERIC:
return new ColumnTypeInfo(Types.NUMERIC, "NUMERIC", 38, 9, 10);
case BIGNUMERIC:
return new ColumnTypeInfo(Types.NUMERIC, "NUMERIC", 77, 38, 10);
case STRING:
return new ColumnTypeInfo(Types.NVARCHAR, "NVARCHAR", null, null, null);
case TIMESTAMP:
case DATETIME:
return new ColumnTypeInfo(Types.TIMESTAMP, "TIMESTAMP", 29, null, null);
case DATE:
return new ColumnTypeInfo(Types.DATE, "DATE", 10, null, null);
case TIME:
return new ColumnTypeInfo(Types.TIME, "TIME", 15, null, null);
case GEOGRAPHY:
return new ColumnTypeInfo(Types.OTHER, "GEOGRAPHY", null, null, null);
case JSON:
return new ColumnTypeInfo(Types.OTHER, "JSON", null, null, null);
case INTERVAL:
return new ColumnTypeInfo(Types.OTHER, "INTERVAL", null, null, null);
case BYTES:
return new ColumnTypeInfo(Types.VARBINARY, "VARBINARY", null, null, null);
case STRUCT:
return new ColumnTypeInfo(Types.STRUCT, "STRUCT", null, null, null);
default:
LOG.warning(
"Unknown BigQuery type encountered: " + bqType.name() + ". Mapping to VARCHAR.");
return new ColumnTypeInfo(Types.VARCHAR, bqType.name(), null, null, null);
ColumnTypeInfo info = STANDARD_TYPE_INFO.get(bqType);
if (info == null) {
LOG.warning("Unknown BigQuery type encountered: " + bqType.name() + ". Mapping to STRING.");
return new ColumnTypeInfo(Types.NVARCHAR, "STRING", null, null, null);
}
return info;
}

<T> List<T> findMatchingBigQueryObjects(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ public Object invoke(Object proxy, Method method, Object[] args) throws Throwabl
// Support standard JDBC Wrapper unwrap operations
if (methodName.equals("unwrap") && args != null && args.length == 1) {
Class<?> iface = (Class<?>) args[0];
if (iface.isInstance(target)) {
if (iface != null && iface.isInstance(target)) {
return target;
}
try {
Expand All @@ -120,7 +120,7 @@ public Object invoke(Object proxy, Method method, Object[] args) throws Throwabl
}
if (methodName.equals("isWrapperFor") && args != null && args.length == 1) {
Class<?> iface = (Class<?>) args[0];
if (iface.isInstance(target)) {
if (iface != null && iface.isInstance(target)) {
return true;
}
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import com.google.cloud.bigquery.Field.Mode;
import com.google.cloud.bigquery.FieldList;
import com.google.cloud.bigquery.StandardSQLTypeName;
import com.google.cloud.bigquery.exception.BigQueryJdbcSqlFeatureNotSupportedException;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
Expand Down Expand Up @@ -74,8 +73,7 @@ public boolean isCaseSensitive(int column) {

@Override
public boolean isSearchable(int column) {
int colType = getColumnType(column);
return colType != Types.OTHER;
return true;
}

@Override
Expand Down Expand Up @@ -205,14 +203,17 @@ public String getColumnClassName(int column) {
.getName();
}

// Unsupported methods:
// Wrapper methods:
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
throw new BigQueryJdbcSqlFeatureNotSupportedException("unwrap is not implemented");
if (iface.isInstance(this)) {
return iface.cast(this);
}
throw new SQLException("Cannot unwrap to " + iface.getName());
}

@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
throw new BigQueryJdbcSqlFeatureNotSupportedException("isWrapperFor is not implemented");
return iface != null && iface.isInstance(this);
}
}
Loading
Loading