Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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 @@ -4835,6 +4835,8 @@ private Tuple<String, String> determineEffectiveCatalogAndSchema(

// BigQuery STRING represents Unicode character strings (UTF-8).
// Standard JDBC maps UTF-8/Unicode data to Types.NVARCHAR rather than Types.VARCHAR.
// Precision and scale values for temporal types (TIMESTAMP, DATETIME, DATE, TIME) are
Comment thread
Neenu1995 marked this conversation as resolved.
Outdated
// aligned with BigQueryResultSetMetadata to ensure consistent metadata behavior.
private static final Map<StandardSQLTypeName, ColumnTypeInfo> STANDARD_TYPE_INFO =
ImmutableMap.<StandardSQLTypeName, ColumnTypeInfo>builder()
.put(StandardSQLTypeName.INT64, new ColumnTypeInfo(Types.BIGINT, "INT64", 19, 0, 10))
Expand All @@ -4851,12 +4853,12 @@ private Tuple<String, String> determineEffectiveCatalogAndSchema(
new ColumnTypeInfo(Types.NVARCHAR, "STRING", null, null, null))
.put(
StandardSQLTypeName.TIMESTAMP,
new ColumnTypeInfo(Types.TIMESTAMP, "TIMESTAMP", 29, null, null))
new ColumnTypeInfo(Types.TIMESTAMP, "TIMESTAMP", 26, 6, 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))
new ColumnTypeInfo(Types.TIMESTAMP, "DATETIME", 26, 6, null))
.put(StandardSQLTypeName.DATE, new ColumnTypeInfo(Types.DATE, "DATE", 10, 0, null))
.put(StandardSQLTypeName.TIME, new ColumnTypeInfo(Types.TIME, "TIME", 15, 6, null))
.put(
StandardSQLTypeName.GEOGRAPHY,
new ColumnTypeInfo(Types.OTHER, "GEOGRAPHY", null, null, null))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,12 +133,53 @@ public String getColumnName(int column) {

@Override
public int getPrecision(int column) {
return (int) (getField(column).getPrecision() != null ? getField(column).getPrecision() : 0);
Long precision = getField(column).getPrecision();
if (precision != null) {
return precision.intValue();
}
StandardSQLTypeName type = getStandardSQLTypeName(column);
switch (type) {
case BOOL:
return 1; // 1 digit
case INT64:
return 19; // Maximum digits for a signed 64-bit integer
case FLOAT64:
return 15; // Approximate decimal precision of a double-precision float
case NUMERIC:
return 38; // Standard BigQuery NUMERIC precision
case BIGNUMERIC:
return 77; // Standard BigQuery BIGNUMERIC precision
case DATE:
return 10; // Character length of "YYYY-MM-DD"
case TIME:
return 15; // Character length of "HH:MM:SS.ffffff" (microsecond resolution)
case TIMESTAMP:
case DATETIME:
return 26; // Character length of "YYYY-MM-DD HH:MM:SS.ffffff" (microsecond resolution)
default:
return 0;
}
}

@Override
public int getScale(int column) {
return (int) (getField(column).getScale() != null ? getField(column).getScale() : 0);
Long scale = getField(column).getScale();
if (scale != null) {
return scale.intValue();
}
StandardSQLTypeName type = getStandardSQLTypeName(column);
switch (type) {
case NUMERIC:
return 9; // Standard BigQuery NUMERIC scale
case BIGNUMERIC:
return 38; // Standard BigQuery BIGNUMERIC scale
case TIME:
case TIMESTAMP:
case DATETIME:
return 6; // Microsecond resolution
default:
return 0;
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -320,8 +320,8 @@ public void testMapBigQueryTypeToJdbc_ScalarTypes() {
dbMetadata.mapBigQueryTypeToJdbc(fieldTimestamp);
assertEquals(Types.TIMESTAMP, infoTimestamp.jdbcType);
assertEquals("TIMESTAMP", infoTimestamp.typeName);
assertEquals(Integer.valueOf(29), infoTimestamp.columnSize);
assertNull(infoTimestamp.decimalDigits);
assertEquals(Integer.valueOf(26), infoTimestamp.columnSize);
assertEquals(Integer.valueOf(6), infoTimestamp.decimalDigits);
assertNull(infoTimestamp.numPrecRadix);

// DATETIME -> TIMESTAMP
Expand All @@ -333,8 +333,8 @@ public void testMapBigQueryTypeToJdbc_ScalarTypes() {
dbMetadata.mapBigQueryTypeToJdbc(fieldDateTime);
assertEquals(Types.TIMESTAMP, infoDateTime.jdbcType);
assertEquals("DATETIME", infoDateTime.typeName);
assertEquals(Integer.valueOf(29), infoDateTime.columnSize);
assertNull(infoDateTime.decimalDigits);
assertEquals(Integer.valueOf(26), infoDateTime.columnSize);
assertEquals(Integer.valueOf(6), infoDateTime.decimalDigits);
assertNull(infoDateTime.numPrecRadix);

// NUMERIC -> NUMERIC
Expand Down Expand Up @@ -402,6 +402,8 @@ public void testMapBigQueryTypeToJdbc_ScalarTypes() {
BigQueryDatabaseMetaData.ColumnTypeInfo infoDate = dbMetadata.mapBigQueryTypeToJdbc(fieldDate);
assertEquals(Types.DATE, infoDate.jdbcType);
assertEquals("DATE", infoDate.typeName);
assertEquals(Integer.valueOf(10), infoDate.columnSize);
assertEquals(Integer.valueOf(0), infoDate.decimalDigits);

// TIME
Field fieldTime =
Expand All @@ -411,6 +413,8 @@ public void testMapBigQueryTypeToJdbc_ScalarTypes() {
BigQueryDatabaseMetaData.ColumnTypeInfo infoTime = dbMetadata.mapBigQueryTypeToJdbc(fieldTime);
assertEquals(Types.TIME, infoTime.jdbcType);
assertEquals("TIME", infoTime.typeName);
assertEquals(Integer.valueOf(15), infoTime.columnSize);
assertEquals(Integer.valueOf(6), infoTime.decimalDigits);

// STRUCT
Field fieldStruct =
Expand Down Expand Up @@ -1295,7 +1299,7 @@ public void testCreateProcedureColumnRow_InOutTimestampParam() {
String.valueOf(DatabaseMetaData.procedureColumnInOut), row.get(4).getStringValue());
assertEquals(String.valueOf(Types.TIMESTAMP), row.get(5).getStringValue());
assertEquals("TIMESTAMP", row.get(6).getStringValue());
assertEquals("29", row.get(7).getStringValue()); // PRECISION for TIMESTAMP
assertEquals("26", row.get(7).getStringValue()); // PRECISION for TIMESTAMP
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -181,9 +181,19 @@ public void testResultSetMetadataProperties() throws SQLException {

@Test
public void testPrecision() throws SQLException {
assertThat(resultSetMetaData.getPrecision(10)).isEqualTo(12L);
assertThat(resultSetMetaData.getPrecision(1))
.isEqualTo(0); // schema doesn't have this info, should be defaulted to 0
assertThat(resultSetMetaData.getPrecision(1)).isEqualTo(1);
assertThat(resultSetMetaData.getPrecision(2)).isEqualTo(19);
assertThat(resultSetMetaData.getPrecision(3)).isEqualTo(15);
assertThat(resultSetMetaData.getPrecision(4)).isEqualTo(0);
assertThat(resultSetMetaData.getPrecision(5)).isEqualTo(26);
assertThat(resultSetMetaData.getPrecision(6)).isEqualTo(0);
assertThat(resultSetMetaData.getPrecision(7)).isEqualTo(0);
assertThat(resultSetMetaData.getPrecision(8)).isEqualTo(0);
assertThat(resultSetMetaData.getPrecision(9)).isEqualTo(0);
assertThat(resultSetMetaData.getPrecision(10)).isEqualTo(12);
assertThat(resultSetMetaData.getPrecision(11)).isEqualTo(77);
assertThat(resultSetMetaData.getPrecision(12)).isEqualTo(15);
assertThat(resultSetMetaData.getPrecision(13)).isEqualTo(10);
}

@Test
Expand All @@ -209,8 +219,19 @@ public void testCheckCaseSensitive() throws SQLException {

@Test
public void testScale() throws SQLException {
assertThat(resultSetMetaData.getScale(10)).isEqualTo(9L);
assertThat(resultSetMetaData.getScale(4)).isEqualTo(0L);
assertThat(resultSetMetaData.getScale(1)).isEqualTo(0);
assertThat(resultSetMetaData.getScale(2)).isEqualTo(0);
assertThat(resultSetMetaData.getScale(3)).isEqualTo(0);
assertThat(resultSetMetaData.getScale(4)).isEqualTo(0);
assertThat(resultSetMetaData.getScale(5)).isEqualTo(6);
assertThat(resultSetMetaData.getScale(6)).isEqualTo(0);
assertThat(resultSetMetaData.getScale(7)).isEqualTo(0);
assertThat(resultSetMetaData.getScale(8)).isEqualTo(0);
assertThat(resultSetMetaData.getScale(9)).isEqualTo(0);
assertThat(resultSetMetaData.getScale(10)).isEqualTo(9);
assertThat(resultSetMetaData.getScale(11)).isEqualTo(38);
assertThat(resultSetMetaData.getScale(12)).isEqualTo(6);
assertThat(resultSetMetaData.getScale(13)).isEqualTo(0);
}

@Test
Expand Down
Loading