Skip to content

Commit f7fa992

Browse files
committed
one source of truth
1 parent 3d638e9 commit f7fa992

4 files changed

Lines changed: 95 additions & 135 deletions

File tree

java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDatabaseMetaData.java

Lines changed: 2 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
import com.google.cloud.bigquery.TableDefinition;
4343
import com.google.cloud.bigquery.TableId;
4444
import com.google.cloud.bigquery.exception.BigQueryJdbcException;
45-
import com.google.common.collect.ImmutableMap;
45+
import com.google.cloud.bigquery.jdbc.BigQueryJdbcTypeMappings.ColumnTypeInfo;
4646
import java.io.BufferedReader;
4747
import java.io.IOException;
4848
import java.io.InputStream;
@@ -60,7 +60,6 @@
6060
import java.util.Comparator;
6161
import java.util.HashSet;
6262
import java.util.List;
63-
import java.util.Map;
6463
import java.util.Properties;
6564
import java.util.Scanner;
6665
import java.util.Set;
@@ -2436,27 +2435,6 @@ List<FieldValue> createColumnRow(
24362435
return values;
24372436
}
24382437

2439-
static class ColumnTypeInfo {
2440-
final int jdbcType;
2441-
final String typeName;
2442-
final Integer columnSize;
2443-
final Integer decimalDigits;
2444-
final Integer numPrecRadix;
2445-
2446-
ColumnTypeInfo(
2447-
int jdbcType,
2448-
String typeName,
2449-
Integer columnSize,
2450-
Integer decimalDigits,
2451-
Integer numPrecRadix) {
2452-
this.jdbcType = jdbcType;
2453-
this.typeName = typeName;
2454-
this.columnSize = columnSize;
2455-
this.decimalDigits = decimalDigits;
2456-
this.numPrecRadix = numPrecRadix;
2457-
}
2458-
}
2459-
24602438
ColumnTypeInfo mapBigQueryTypeToJdbc(Field field) {
24612439
Mode mode = (field.getMode() == null) ? Mode.NULLABLE : field.getMode();
24622440
if (mode == Mode.REPEATED) {
@@ -4833,55 +4811,12 @@ private Tuple<String, String> determineEffectiveCatalogAndSchema(
48334811
return Tuple.of(effectiveCatalog, effectiveSchemaPattern);
48344812
}
48354813

4836-
// BigQuery STRING represents Unicode character strings (UTF-8).
4837-
// Standard JDBC maps UTF-8/Unicode data to Types.NVARCHAR rather than Types.VARCHAR.
4838-
// Precision and scale values for temporal types (TIMESTAMP, DATETIME, DATE, TIME) are
4839-
// aligned with BigQueryResultSetMetadata to ensure consistent metadata behavior.
4840-
private static final Map<StandardSQLTypeName, ColumnTypeInfo> STANDARD_TYPE_INFO =
4841-
ImmutableMap.<StandardSQLTypeName, ColumnTypeInfo>builder()
4842-
.put(StandardSQLTypeName.INT64, new ColumnTypeInfo(Types.BIGINT, "INT64", 19, 0, 10))
4843-
.put(StandardSQLTypeName.BOOL, new ColumnTypeInfo(Types.BOOLEAN, "BOOL", 1, null, null))
4844-
.put(
4845-
StandardSQLTypeName.FLOAT64,
4846-
new ColumnTypeInfo(Types.DOUBLE, "FLOAT64", 15, null, 10))
4847-
.put(StandardSQLTypeName.NUMERIC, new ColumnTypeInfo(Types.NUMERIC, "NUMERIC", 38, 9, 10))
4848-
.put(
4849-
StandardSQLTypeName.BIGNUMERIC,
4850-
new ColumnTypeInfo(Types.NUMERIC, "BIGNUMERIC", 77, 38, 10))
4851-
.put(
4852-
StandardSQLTypeName.STRING,
4853-
new ColumnTypeInfo(Types.NVARCHAR, "STRING", null, null, null))
4854-
.put(
4855-
StandardSQLTypeName.TIMESTAMP,
4856-
new ColumnTypeInfo(Types.TIMESTAMP, "TIMESTAMP", 26, 6, null))
4857-
.put(
4858-
StandardSQLTypeName.DATETIME,
4859-
new ColumnTypeInfo(Types.TIMESTAMP, "DATETIME", 26, 6, null))
4860-
.put(StandardSQLTypeName.DATE, new ColumnTypeInfo(Types.DATE, "DATE", 10, 0, null))
4861-
.put(StandardSQLTypeName.TIME, new ColumnTypeInfo(Types.TIME, "TIME", 15, 6, null))
4862-
.put(
4863-
StandardSQLTypeName.GEOGRAPHY,
4864-
new ColumnTypeInfo(Types.OTHER, "GEOGRAPHY", null, null, null))
4865-
.put(StandardSQLTypeName.JSON, new ColumnTypeInfo(Types.OTHER, "JSON", null, null, null))
4866-
.put(
4867-
StandardSQLTypeName.INTERVAL,
4868-
new ColumnTypeInfo(Types.OTHER, "INTERVAL", null, null, null))
4869-
.put(
4870-
StandardSQLTypeName.RANGE, new ColumnTypeInfo(Types.OTHER, "RANGE", null, null, null))
4871-
.put(
4872-
StandardSQLTypeName.BYTES,
4873-
new ColumnTypeInfo(Types.VARBINARY, "BYTES", null, null, null))
4874-
.put(
4875-
StandardSQLTypeName.STRUCT,
4876-
new ColumnTypeInfo(Types.STRUCT, "STRUCT", null, null, null))
4877-
.build();
4878-
48794814
private ColumnTypeInfo getColumnTypeInfoForSqlType(StandardSQLTypeName bqType) {
48804815
if (bqType == null) {
48814816
LOG.warning("Null BigQuery type encountered. Mapping to STRING.");
48824817
return new ColumnTypeInfo(Types.NVARCHAR, "STRING", null, null, null);
48834818
}
4884-
ColumnTypeInfo info = STANDARD_TYPE_INFO.get(bqType);
4819+
ColumnTypeInfo info = BigQueryJdbcTypeMappings.STANDARD_TYPE_INFO.get(bqType);
48854820
if (info == null) {
48864821
LOG.warning("Unknown BigQuery type encountered: " + bqType.name() + ". Mapping to STRING.");
48874822
return new ColumnTypeInfo(Types.NVARCHAR, "STRING", null, null, null);

java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcTypeMappings.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,4 +158,64 @@ static Class<?> getJavaType(int javaSQLType) throws BigQueryJdbcSqlFeatureNotSup
158158
private static <K, V> SimpleEntry<K, V> entry(K key, V value) {
159159
return new SimpleEntry<>(key, value);
160160
}
161+
162+
static class ColumnTypeInfo {
163+
final int jdbcType;
164+
final String typeName;
165+
final Integer columnSize;
166+
final Integer decimalDigits;
167+
final Integer numPrecRadix;
168+
169+
ColumnTypeInfo(
170+
int jdbcType,
171+
String typeName,
172+
Integer columnSize,
173+
Integer decimalDigits,
174+
Integer numPrecRadix) {
175+
this.jdbcType = jdbcType;
176+
this.typeName = typeName;
177+
this.columnSize = columnSize;
178+
this.decimalDigits = decimalDigits;
179+
this.numPrecRadix = numPrecRadix;
180+
}
181+
}
182+
183+
static final Map<StandardSQLTypeName, ColumnTypeInfo> STANDARD_TYPE_INFO =
184+
ImmutableMap.<StandardSQLTypeName, ColumnTypeInfo>builder()
185+
.put(StandardSQLTypeName.INT64, new ColumnTypeInfo(Types.BIGINT, "INT64", 19, 0, 10))
186+
.put(StandardSQLTypeName.BOOL, new ColumnTypeInfo(Types.BOOLEAN, "BOOL", 1, null, null))
187+
.put(
188+
StandardSQLTypeName.FLOAT64,
189+
new ColumnTypeInfo(Types.DOUBLE, "FLOAT64", 15, null, 10))
190+
.put(StandardSQLTypeName.NUMERIC, new ColumnTypeInfo(Types.NUMERIC, "NUMERIC", 38, 9, 10))
191+
.put(
192+
StandardSQLTypeName.BIGNUMERIC,
193+
new ColumnTypeInfo(Types.NUMERIC, "BIGNUMERIC", 77, 38, 10))
194+
.put(
195+
StandardSQLTypeName.STRING,
196+
new ColumnTypeInfo(Types.NVARCHAR, "STRING", null, null, null))
197+
.put(
198+
StandardSQLTypeName.TIMESTAMP,
199+
new ColumnTypeInfo(Types.TIMESTAMP, "TIMESTAMP", 26, 6, null))
200+
.put(
201+
StandardSQLTypeName.DATETIME,
202+
new ColumnTypeInfo(Types.TIMESTAMP, "DATETIME", 26, 6, null))
203+
.put(StandardSQLTypeName.DATE, new ColumnTypeInfo(Types.DATE, "DATE", 10, 0, null))
204+
.put(StandardSQLTypeName.TIME, new ColumnTypeInfo(Types.TIME, "TIME", 15, 6, null))
205+
.put(
206+
StandardSQLTypeName.GEOGRAPHY,
207+
new ColumnTypeInfo(Types.OTHER, "GEOGRAPHY", null, null, null))
208+
.put(StandardSQLTypeName.JSON, new ColumnTypeInfo(Types.OTHER, "JSON", null, null, null))
209+
.put(
210+
StandardSQLTypeName.INTERVAL,
211+
new ColumnTypeInfo(Types.OTHER, "INTERVAL", null, null, null))
212+
.put(
213+
StandardSQLTypeName.RANGE, new ColumnTypeInfo(Types.OTHER, "RANGE", null, null, null))
214+
.put(
215+
StandardSQLTypeName.BYTES,
216+
new ColumnTypeInfo(Types.VARBINARY, "BYTES", null, null, null))
217+
.put(
218+
StandardSQLTypeName.STRUCT,
219+
new ColumnTypeInfo(Types.STRUCT, "STRUCT", null, null, null))
220+
.build();
161221
}

java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryResultSetMetadata.java

Lines changed: 10 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -138,27 +138,12 @@ public int getPrecision(int column) {
138138
return precision.intValue();
139139
}
140140
StandardSQLTypeName type = getStandardSQLTypeName(column);
141-
switch (type) {
142-
case BOOL:
143-
return 1; // 1 digit
144-
case INT64:
145-
return 19; // Maximum digits for a signed 64-bit integer
146-
case FLOAT64:
147-
return 15; // Approximate decimal precision of a double-precision float
148-
case NUMERIC:
149-
return 38; // Standard BigQuery NUMERIC precision
150-
case BIGNUMERIC:
151-
return 77; // Standard BigQuery BIGNUMERIC precision
152-
case DATE:
153-
return 10; // Character length of "YYYY-MM-DD"
154-
case TIME:
155-
return 15; // Character length of "HH:MM:SS.ffffff" (microsecond resolution)
156-
case TIMESTAMP:
157-
case DATETIME:
158-
return 26; // Character length of "YYYY-MM-DD HH:MM:SS.ffffff" (microsecond resolution)
159-
default:
160-
return 0;
141+
BigQueryJdbcTypeMappings.ColumnTypeInfo typeInfo =
142+
BigQueryJdbcTypeMappings.STANDARD_TYPE_INFO.get(type);
143+
if (typeInfo != null && typeInfo.columnSize != null) {
144+
return typeInfo.columnSize;
161145
}
146+
return 0;
162147
}
163148

164149
@Override
@@ -168,18 +153,12 @@ public int getScale(int column) {
168153
return scale.intValue();
169154
}
170155
StandardSQLTypeName type = getStandardSQLTypeName(column);
171-
switch (type) {
172-
case NUMERIC:
173-
return 9; // Standard BigQuery NUMERIC scale
174-
case BIGNUMERIC:
175-
return 38; // Standard BigQuery BIGNUMERIC scale
176-
case TIME:
177-
case TIMESTAMP:
178-
case DATETIME:
179-
return 6; // Microsecond resolution
180-
default:
181-
return 0;
156+
BigQueryJdbcTypeMappings.ColumnTypeInfo typeInfo =
157+
BigQueryJdbcTypeMappings.STANDARD_TYPE_INFO.get(type);
158+
if (typeInfo != null && typeInfo.decimalDigits != null) {
159+
return typeInfo.decimalDigits;
182160
}
161+
return 0;
183162
}
184163

185164
@Override

0 commit comments

Comments
 (0)