Skip to content

Commit 99f769c

Browse files
committed
fix(bigquery-jdbc): fallback to standard precision and scale for numeric, integer, and temporal types
1 parent dcc2a68 commit 99f769c

2 files changed

Lines changed: 69 additions & 7 deletions

File tree

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

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,53 @@ public String getColumnName(int column) {
133133

134134
@Override
135135
public int getPrecision(int column) {
136-
return (int) (getField(column).getPrecision() != null ? getField(column).getPrecision() : 0);
136+
Long precision = getField(column).getPrecision();
137+
if (precision != null) {
138+
return precision.intValue();
139+
}
140+
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;
161+
}
137162
}
138163

139164
@Override
140165
public int getScale(int column) {
141-
return (int) (getField(column).getScale() != null ? getField(column).getScale() : 0);
166+
Long scale = getField(column).getScale();
167+
if (scale != null) {
168+
return scale.intValue();
169+
}
170+
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;
182+
}
142183
}
143184

144185
@Override

java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryResultSetMetadataTest.java

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,19 @@ public void testResultSetMetadataProperties() throws SQLException {
181181

182182
@Test
183183
public void testPrecision() throws SQLException {
184-
assertThat(resultSetMetaData.getPrecision(10)).isEqualTo(12L);
185-
assertThat(resultSetMetaData.getPrecision(1))
186-
.isEqualTo(0); // schema doesn't have this info, should be defaulted to 0
184+
assertThat(resultSetMetaData.getPrecision(1)).isEqualTo(1);
185+
assertThat(resultSetMetaData.getPrecision(2)).isEqualTo(19);
186+
assertThat(resultSetMetaData.getPrecision(3)).isEqualTo(15);
187+
assertThat(resultSetMetaData.getPrecision(4)).isEqualTo(0);
188+
assertThat(resultSetMetaData.getPrecision(5)).isEqualTo(26);
189+
assertThat(resultSetMetaData.getPrecision(6)).isEqualTo(0);
190+
assertThat(resultSetMetaData.getPrecision(7)).isEqualTo(0);
191+
assertThat(resultSetMetaData.getPrecision(8)).isEqualTo(0);
192+
assertThat(resultSetMetaData.getPrecision(9)).isEqualTo(0);
193+
assertThat(resultSetMetaData.getPrecision(10)).isEqualTo(12);
194+
assertThat(resultSetMetaData.getPrecision(11)).isEqualTo(77);
195+
assertThat(resultSetMetaData.getPrecision(12)).isEqualTo(15);
196+
assertThat(resultSetMetaData.getPrecision(13)).isEqualTo(10);
187197
}
188198

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

210220
@Test
211221
public void testScale() throws SQLException {
212-
assertThat(resultSetMetaData.getScale(10)).isEqualTo(9L);
213-
assertThat(resultSetMetaData.getScale(4)).isEqualTo(0L);
222+
assertThat(resultSetMetaData.getScale(1)).isEqualTo(0);
223+
assertThat(resultSetMetaData.getScale(2)).isEqualTo(0);
224+
assertThat(resultSetMetaData.getScale(3)).isEqualTo(0);
225+
assertThat(resultSetMetaData.getScale(4)).isEqualTo(0);
226+
assertThat(resultSetMetaData.getScale(5)).isEqualTo(6);
227+
assertThat(resultSetMetaData.getScale(6)).isEqualTo(0);
228+
assertThat(resultSetMetaData.getScale(7)).isEqualTo(0);
229+
assertThat(resultSetMetaData.getScale(8)).isEqualTo(0);
230+
assertThat(resultSetMetaData.getScale(9)).isEqualTo(0);
231+
assertThat(resultSetMetaData.getScale(10)).isEqualTo(9);
232+
assertThat(resultSetMetaData.getScale(11)).isEqualTo(38);
233+
assertThat(resultSetMetaData.getScale(12)).isEqualTo(6);
234+
assertThat(resultSetMetaData.getScale(13)).isEqualTo(0);
214235
}
215236

216237
@Test

0 commit comments

Comments
 (0)