Skip to content
This repository was archived by the owner on Feb 24, 2026. It is now read-only.

Commit d046c8d

Browse files
authored
fix: ints/longs are numerics (#1596)
Should allow users to pass ints and longs as numerics. Fixes #1516
1 parent 320f5fc commit d046c8d

File tree

7 files changed

+208
-20
lines changed

7 files changed

+208
-20
lines changed

google-cloud-bigquerystorage/src/main/java/com/google/cloud/bigquery/storage/v1/JsonToProtoMessage.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,12 @@ private static void fillField(
290290
BigDecimalByteStringEncoder.encodeToNumericByteString(
291291
new BigDecimal((String) val)));
292292
return;
293+
} else if (val instanceof Integer || val instanceof Long) {
294+
protoMsg.setField(
295+
fieldDescriptor,
296+
BigDecimalByteStringEncoder.encodeToNumericByteString(
297+
new BigDecimal(((Number) val).longValue())));
298+
return;
293299
}
294300
} else if (fieldSchema.getType() == TableFieldSchema.Type.BIGNUMERIC) {
295301
if (val instanceof String) {
@@ -298,6 +304,12 @@ private static void fillField(
298304
BigDecimalByteStringEncoder.encodeToBigNumericByteString(
299305
new BigDecimal((String) val)));
300306
return;
307+
} else if (val instanceof Integer || val instanceof Long) {
308+
protoMsg.setField(
309+
fieldDescriptor,
310+
BigDecimalByteStringEncoder.encodeToBigNumericByteString(
311+
new BigDecimal(((Number) val).longValue())));
312+
return;
301313
}
302314
}
303315
}
@@ -504,6 +516,12 @@ private static void fillRepeatedField(
504516
BigDecimalByteStringEncoder.encodeToNumericByteString(
505517
new BigDecimal((String) val)));
506518
added = true;
519+
} else if (val instanceof Integer || val instanceof Long) {
520+
protoMsg.addRepeatedField(
521+
fieldDescriptor,
522+
BigDecimalByteStringEncoder.encodeToNumericByteString(
523+
new BigDecimal(((Number) val).longValue())));
524+
added = true;
507525
}
508526
} else if (fieldSchema != null
509527
&& fieldSchema.getType() == TableFieldSchema.Type.BIGNUMERIC) {
@@ -513,6 +531,12 @@ private static void fillRepeatedField(
513531
BigDecimalByteStringEncoder.encodeToBigNumericByteString(
514532
new BigDecimal((String) val)));
515533
added = true;
534+
} else if (val instanceof Integer || val instanceof Long) {
535+
protoMsg.addRepeatedField(
536+
fieldDescriptor,
537+
BigDecimalByteStringEncoder.encodeToBigNumericByteString(
538+
new BigDecimal(((Number) val).longValue())));
539+
added = true;
516540
}
517541
}
518542
if (!added) {

google-cloud-bigquerystorage/src/main/java/com/google/cloud/bigquery/storage/v1beta2/JsonToProtoMessage.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,12 @@ private static void fillField(
197197
BigDecimalByteStringEncoder.encodeToNumericByteString(
198198
new BigDecimal((String) val)));
199199
return;
200+
} else if (val instanceof Long || val instanceof Integer) {
201+
protoMsg.setField(
202+
fieldDescriptor,
203+
BigDecimalByteStringEncoder.encodeToNumericByteString(
204+
new BigDecimal(((Number) val).longValue())));
205+
return;
200206
}
201207
} else if (fieldSchema.getType() == TableFieldSchema.Type.BIGNUMERIC) {
202208
if (val instanceof String) {
@@ -205,6 +211,12 @@ private static void fillField(
205211
BigDecimalByteStringEncoder.encodeToNumericByteString(
206212
new BigDecimal((String) val)));
207213
return;
214+
} else if (val instanceof Long || val instanceof Integer) {
215+
protoMsg.setField(
216+
fieldDescriptor,
217+
BigDecimalByteStringEncoder.encodeToNumericByteString(
218+
new BigDecimal(((Number) val).longValue())));
219+
return;
208220
}
209221
}
210222
}
@@ -357,6 +369,12 @@ private static void fillRepeatedField(
357369
BigDecimalByteStringEncoder.encodeToNumericByteString(
358370
new BigDecimal((String) val)));
359371
added = true;
372+
} else if (val instanceof Long || val instanceof Integer) {
373+
protoMsg.addRepeatedField(
374+
fieldDescriptor,
375+
BigDecimalByteStringEncoder.encodeToNumericByteString(
376+
new BigDecimal(((Number) val).longValue())));
377+
added = true;
360378
}
361379
} else if (fieldSchema != null
362380
&& fieldSchema.getType() == TableFieldSchema.Type.BIGNUMERIC) {
@@ -366,6 +384,12 @@ private static void fillRepeatedField(
366384
BigDecimalByteStringEncoder.encodeToNumericByteString(
367385
new BigDecimal((String) val)));
368386
added = true;
387+
} else if (val instanceof Long || val instanceof Integer) {
388+
protoMsg.addRepeatedField(
389+
fieldDescriptor,
390+
BigDecimalByteStringEncoder.encodeToNumericByteString(
391+
new BigDecimal(((Number) val).longValue())));
392+
added = true;
369393
}
370394
}
371395
if (!added) {

google-cloud-bigquerystorage/src/test/java/com/google/cloud/bigquery/storage/v1/BQTableSchemaToProtoDescriptorTest.java

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,18 @@ public void testStructComplex() throws Exception {
233233
.setMode(TableFieldSchema.Mode.NULLABLE)
234234
.setName("test_numeric_str")
235235
.build();
236+
final TableFieldSchema TEST_NUMERIC_INT =
237+
TableFieldSchema.newBuilder()
238+
.setType(TableFieldSchema.Type.NUMERIC)
239+
.setMode(TableFieldSchema.Mode.NULLABLE)
240+
.setName("test_numeric_int")
241+
.build();
242+
final TableFieldSchema TEST_NUMERIC_LONG =
243+
TableFieldSchema.newBuilder()
244+
.setType(TableFieldSchema.Type.NUMERIC)
245+
.setMode(TableFieldSchema.Mode.NULLABLE)
246+
.setName("test_numeric_long")
247+
.build();
236248
final TableFieldSchema TEST_BIGNUMERIC =
237249
TableFieldSchema.newBuilder()
238250
.setType(TableFieldSchema.Type.BIGNUMERIC)
@@ -245,6 +257,18 @@ public void testStructComplex() throws Exception {
245257
.setMode(TableFieldSchema.Mode.REPEATED)
246258
.setName("test_bignumeric_str")
247259
.build();
260+
final TableFieldSchema TEST_BIGNUMERIC_INT =
261+
TableFieldSchema.newBuilder()
262+
.setType(TableFieldSchema.Type.BIGNUMERIC)
263+
.setMode(TableFieldSchema.Mode.NULLABLE)
264+
.setName("test_bignumeric_int")
265+
.build();
266+
final TableFieldSchema TEST_BIGNUMERIC_LONG =
267+
TableFieldSchema.newBuilder()
268+
.setType(TableFieldSchema.Type.BIGNUMERIC)
269+
.setMode(TableFieldSchema.Mode.NULLABLE)
270+
.setName("test_bignumeric_long")
271+
.build();
248272
final TableFieldSchema TEST_INTERVAL =
249273
TableFieldSchema.newBuilder()
250274
.setType(TableFieldSchema.Type.INTERVAL)
@@ -276,10 +300,14 @@ public void testStructComplex() throws Exception {
276300
.addFields(14, TEST_TIME_STR)
277301
.addFields(15, TEST_NUMERIC_REPEATED)
278302
.addFields(16, TEST_NUMERIC_STR)
279-
.addFields(17, TEST_BIGNUMERIC)
280-
.addFields(18, TEST_BIGNUMERIC_STR)
281-
.addFields(19, TEST_INTERVAL)
282-
.addFields(20, TEST_JSON)
303+
.addFields(17, TEST_NUMERIC_INT)
304+
.addFields(18, TEST_NUMERIC_LONG)
305+
.addFields(19, TEST_BIGNUMERIC)
306+
.addFields(20, TEST_BIGNUMERIC_STR)
307+
.addFields(21, TEST_BIGNUMERIC_INT)
308+
.addFields(22, TEST_BIGNUMERIC_LONG)
309+
.addFields(23, TEST_INTERVAL)
310+
.addFields(24, TEST_JSON)
283311
.build();
284312
final Descriptor descriptor =
285313
BQTableSchemaToProtoDescriptor.convertBQTableSchemaToProtoDescriptor(tableSchema);

google-cloud-bigquerystorage/src/test/java/com/google/cloud/bigquery/storage/v1/JsonToProtoMessageTest.java

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,18 @@ public class JsonToProtoMessageTest {
409409
.setMode(TableFieldSchema.Mode.NULLABLE)
410410
.setName("test_numeric_str")
411411
.build();
412+
private final TableFieldSchema TEST_NUMERIC_INT =
413+
TableFieldSchema.newBuilder()
414+
.setType(TableFieldSchema.Type.NUMERIC)
415+
.setMode(TableFieldSchema.Mode.NULLABLE)
416+
.setName("test_numeric_int")
417+
.build();
418+
private final TableFieldSchema TEST_NUMERIC_LONG =
419+
TableFieldSchema.newBuilder()
420+
.setType(TableFieldSchema.Type.NUMERIC)
421+
.setMode(TableFieldSchema.Mode.NULLABLE)
422+
.setName("test_numeric_long")
423+
.build();
412424
private final TableFieldSchema TEST_BIGNUMERIC =
413425
TableFieldSchema.newBuilder()
414426
.setType(TableFieldSchema.Type.BIGNUMERIC)
@@ -421,6 +433,18 @@ public class JsonToProtoMessageTest {
421433
.setMode(TableFieldSchema.Mode.REPEATED)
422434
.setName("test_bignumeric_str")
423435
.build();
436+
private final TableFieldSchema TEST_BIGNUMERIC_INT =
437+
TableFieldSchema.newBuilder()
438+
.setType(TableFieldSchema.Type.BIGNUMERIC)
439+
.setMode(TableFieldSchema.Mode.NULLABLE)
440+
.setName("test_bignumeric_int")
441+
.build();
442+
private final TableFieldSchema TEST_BIGNUMERIC_LONG =
443+
TableFieldSchema.newBuilder()
444+
.setType(TableFieldSchema.Type.BIGNUMERIC)
445+
.setMode(TableFieldSchema.Mode.NULLABLE)
446+
.setName("test_bignumeric_long")
447+
.build();
424448
final TableFieldSchema TEST_INTERVAL =
425449
TableFieldSchema.newBuilder()
426450
.setType(TableFieldSchema.Type.INTERVAL)
@@ -452,10 +476,14 @@ public class JsonToProtoMessageTest {
452476
.addFields(14, TEST_TIME_STR)
453477
.addFields(15, TEST_NUMERIC_REPEATED)
454478
.addFields(16, TEST_NUMERIC_STR)
455-
.addFields(17, TEST_BIGNUMERIC)
456-
.addFields(18, TEST_BIGNUMERIC_STR)
457-
.addFields(19, TEST_INTERVAL)
458-
.addFields(20, TEST_JSON)
479+
.addFields(17, TEST_NUMERIC_INT)
480+
.addFields(18, TEST_NUMERIC_LONG)
481+
.addFields(19, TEST_BIGNUMERIC)
482+
.addFields(20, TEST_BIGNUMERIC_STR)
483+
.addFields(21, TEST_BIGNUMERIC_INT)
484+
.addFields(22, TEST_BIGNUMERIC_LONG)
485+
.addFields(23, TEST_INTERVAL)
486+
.addFields(24, TEST_JSON)
459487
.build();
460488

461489
@Test
@@ -888,11 +916,19 @@ public void testStructComplex() throws Exception {
888916
new BigDecimal("-99999999999999999999999999999.999999999")))
889917
.setTestNumericStr(
890918
BigDecimalByteStringEncoder.encodeToNumericByteString(new BigDecimal("12.4")))
919+
.setTestNumericInt(
920+
BigDecimalByteStringEncoder.encodeToNumericByteString(new BigDecimal(1)))
921+
.setTestNumericLong(
922+
BigDecimalByteStringEncoder.encodeToNumericByteString(new BigDecimal(1L)))
891923
.setTestBignumeric(
892924
BigDecimalByteStringEncoder.encodeToBigNumericByteString(
893925
new BigDecimal("578960446186580977117854925043439539266.3")))
894926
.addTestBignumericStr(
895927
BigDecimalByteStringEncoder.encodeToBigNumericByteString(new BigDecimal("1.23")))
928+
.setTestBignumericInt(
929+
BigDecimalByteStringEncoder.encodeToBigNumericByteString(new BigDecimal(1)))
930+
.setTestBignumericLong(
931+
BigDecimalByteStringEncoder.encodeToBigNumericByteString(new BigDecimal(1L)))
896932
.setTestInterval("0-0 0 0:0:0.000005")
897933
.addTestJson("{'a':'b'}")
898934
.build();
@@ -937,11 +973,15 @@ public void testStructComplex() throws Exception {
937973
json.put("test_time", CivilTimeEncoder.encodePacked64TimeMicros(LocalTime.of(1, 0, 1)));
938974
json.put("test_time_str", "20:51:10.1234");
939975
json.put("test_numeric_str", "12.4");
976+
json.put("test_numeric_int", 1);
977+
json.put("test_numeric_long", 1L);
940978
json.put(
941979
"test_bignumeric",
942980
BigDecimalByteStringEncoder.encodeToBigNumericByteString(
943981
new BigDecimal("578960446186580977117854925043439539266.3")));
944982
json.put("test_bignumeric_str", new JSONArray(new String[] {"1.23"}));
983+
json.put("test_bignumeric_int", 1);
984+
json.put("test_bignumeric_long", 1L);
945985
json.put("test_interval", "0-0 0 0:0:0.000005");
946986
json.put("test_json", new JSONArray(new String[] {"{'a':'b'}"}));
947987
DynamicMessage protoMsg =

google-cloud-bigquerystorage/src/test/java/com/google/cloud/bigquery/storage/v1beta2/BQTableSchemaToProtoDescriptorTest.java

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,18 @@ public void testStructComplex() throws Exception {
233233
.setMode(TableFieldSchema.Mode.NULLABLE)
234234
.setName("test_numeric_str")
235235
.build();
236+
final TableFieldSchema TEST_NUMERIC_INT =
237+
TableFieldSchema.newBuilder()
238+
.setType(TableFieldSchema.Type.NUMERIC)
239+
.setMode(TableFieldSchema.Mode.NULLABLE)
240+
.setName("test_numeric_int")
241+
.build();
242+
final TableFieldSchema TEST_NUMERIC_LONG =
243+
TableFieldSchema.newBuilder()
244+
.setType(TableFieldSchema.Type.NUMERIC)
245+
.setMode(TableFieldSchema.Mode.NULLABLE)
246+
.setName("test_numeric_long")
247+
.build();
236248
final TableFieldSchema TEST_BIGNUMERIC =
237249
TableFieldSchema.newBuilder()
238250
.setType(TableFieldSchema.Type.NUMERIC)
@@ -245,6 +257,18 @@ public void testStructComplex() throws Exception {
245257
.setMode(TableFieldSchema.Mode.REPEATED)
246258
.setName("test_bignumeric_str")
247259
.build();
260+
final TableFieldSchema TEST_BIGNUMERIC_INT =
261+
TableFieldSchema.newBuilder()
262+
.setType(TableFieldSchema.Type.NUMERIC)
263+
.setMode(TableFieldSchema.Mode.NULLABLE)
264+
.setName("test_bignumeric_int")
265+
.build();
266+
final TableFieldSchema TEST_BIGNUMERIC_LONG =
267+
TableFieldSchema.newBuilder()
268+
.setType(TableFieldSchema.Type.NUMERIC)
269+
.setMode(TableFieldSchema.Mode.NULLABLE)
270+
.setName("test_bignumeric_long")
271+
.build();
248272
final TableFieldSchema TEST_INTERVAL =
249273
TableFieldSchema.newBuilder()
250274
.setType(TableFieldSchema.Type.INTERVAL)
@@ -276,10 +300,14 @@ public void testStructComplex() throws Exception {
276300
.addFields(14, TEST_TIME_STR)
277301
.addFields(15, TEST_NUMERIC_REPEATED)
278302
.addFields(16, TEST_NUMERIC_STR)
279-
.addFields(17, TEST_BIGNUMERIC)
280-
.addFields(18, TEST_BIGNUMERIC_STR)
281-
.addFields(19, TEST_INTERVAL)
282-
.addFields(20, TEST_JSON)
303+
.addFields(17, TEST_NUMERIC_INT)
304+
.addFields(18, TEST_NUMERIC_LONG)
305+
.addFields(19, TEST_BIGNUMERIC)
306+
.addFields(20, TEST_BIGNUMERIC_STR)
307+
.addFields(21, TEST_BIGNUMERIC_INT)
308+
.addFields(22, TEST_BIGNUMERIC_LONG)
309+
.addFields(23, TEST_INTERVAL)
310+
.addFields(24, TEST_JSON)
283311
.build();
284312
final Descriptor descriptor =
285313
BQTableSchemaToProtoDescriptor.convertBQTableSchemaToProtoDescriptor(tableSchema);

0 commit comments

Comments
 (0)