From 7ea9ff8690e8d9570754fb7b0d742e68ca15b6de Mon Sep 17 00:00:00 2001 From: Keshav Dandeva Date: Mon, 13 Jul 2026 14:58:30 +0000 Subject: [PATCH 1/3] fix(bigquery): support optional fields in BigLakeConfiguration to prevent NPE on Iceberg/Lakehouse tables --- .../cloud/bigquery/BigLakeConfiguration.java | 21 ++++++++++++------- .../bigquery/BigLakeConfigurationTest.java | 20 ++++++++++++++++++ 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigLakeConfiguration.java b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigLakeConfiguration.java index 76b3f55d942d..67707ab5d8b9 100644 --- a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigLakeConfiguration.java +++ b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigLakeConfiguration.java @@ -18,6 +18,7 @@ import com.google.auto.value.AutoValue; import java.io.Serializable; +import javax.annotation.Nullable; @AutoValue public abstract class BigLakeConfiguration implements Serializable { @@ -30,6 +31,7 @@ public abstract class BigLakeConfiguration implements Serializable { * * @return value or {@code null} for none */ + @Nullable public abstract String getConnectionId(); /** @@ -37,6 +39,7 @@ public abstract class BigLakeConfiguration implements Serializable { * * @return value or {@code null} for none */ + @Nullable public abstract String getFileFormat(); /** @@ -45,6 +48,7 @@ public abstract class BigLakeConfiguration implements Serializable { * * @return value or {@code null} for none */ + @Nullable public abstract String getStorageUri(); /** @@ -52,6 +56,7 @@ public abstract class BigLakeConfiguration implements Serializable { * * @return value or {@code null} for none */ + @Nullable public abstract String getTableFormat(); public static Builder newBuilder() { @@ -63,36 +68,36 @@ public static Builder newBuilder() { @AutoValue.Builder public abstract static class Builder { /** - * [Required] Required and immutable. Credential reference for accessing external storage + * Immutable. Credential reference for accessing external storage * system. Normalized as project_id.location_id.connection_id. * * @param connectionId connectionId or {@code null} for none */ - public abstract Builder setConnectionId(String connectionId); + public abstract Builder setConnectionId(@Nullable String connectionId); /** - * [Required] Required and immutable. Open source file format that the table data is stored in. + * Immutable. Open source file format that the table data is stored in. * Currently only PARQUET is supported. * * @param fileFormat fileFormat or {@code null} for none */ - public abstract Builder setFileFormat(String fileFormat); + public abstract Builder setFileFormat(@Nullable String fileFormat); /** - * [Required] Required and immutable. Fully qualified location prefix of the external folder + * Immutable. Fully qualified location prefix of the external folder * where data is stored. Starts with "gs://" and ends with "/". Does not contain "*". * * @param storageUri storageUri or {@code null} for none */ - public abstract Builder setStorageUri(String storageUri); + public abstract Builder setStorageUri(@Nullable String storageUri); /** - * [Required] Required and immutable. Open source file format that the table data is stored in. + * Immutable. Open source file format that the table data is stored in. * Currently only PARQUET is supported. * * @param tableFormat tableFormat or {@code null} for none */ - public abstract Builder setTableFormat(String tableFormat); + public abstract Builder setTableFormat(@Nullable String tableFormat); public abstract BigLakeConfiguration build(); } diff --git a/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/BigLakeConfigurationTest.java b/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/BigLakeConfigurationTest.java index 66fcd7c6b4ce..31a1713a99b1 100644 --- a/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/BigLakeConfigurationTest.java +++ b/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/BigLakeConfigurationTest.java @@ -61,6 +61,26 @@ void testFromPb() { BIG_LAKE_CONFIGURATION, BigLakeConfiguration.fromPb(BIG_LAKE_CONFIGURATION_PB)); } + @Test + void testNullFields() { + BigLakeConfiguration configuration = BigLakeConfiguration.newBuilder().build(); + assertEquals(null, configuration.getConnectionId()); + assertEquals(null, configuration.getFileFormat()); + assertEquals(null, configuration.getStorageUri()); + assertEquals(null, configuration.getTableFormat()); + } + + @Test + void testFromPbWithNullFields() { + com.google.api.services.bigquery.model.BigLakeConfiguration pb = + new com.google.api.services.bigquery.model.BigLakeConfiguration(); + BigLakeConfiguration configuration = BigLakeConfiguration.fromPb(pb); + assertEquals(null, configuration.getConnectionId()); + assertEquals(null, configuration.getFileFormat()); + assertEquals(null, configuration.getStorageUri()); + assertEquals(null, configuration.getTableFormat()); + } + private static void assertBigLakeConfiguration( BigLakeConfiguration expected, BigLakeConfiguration actual) { assertEquals(expected.getConnectionId(), actual.getConnectionId()); From 42d9d923a964aa59b51df5ae71627ad636c07786 Mon Sep 17 00:00:00 2001 From: Keshav Dandeva Date: Mon, 13 Jul 2026 15:09:49 +0000 Subject: [PATCH 2/3] lint --- .../cloud/bigquery/BigLakeConfiguration.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigLakeConfiguration.java b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigLakeConfiguration.java index 67707ab5d8b9..20da620e48ad 100644 --- a/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigLakeConfiguration.java +++ b/java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigLakeConfiguration.java @@ -52,7 +52,7 @@ public abstract class BigLakeConfiguration implements Serializable { public abstract String getStorageUri(); /** - * Open source file format that the table data is stored in. Currently only PARQUET is supported. + * Open source table format that the table data is stored in. Currently only ICEBERG is supported. * * @return value or {@code null} for none */ @@ -68,32 +68,32 @@ public static Builder newBuilder() { @AutoValue.Builder public abstract static class Builder { /** - * Immutable. Credential reference for accessing external storage - * system. Normalized as project_id.location_id.connection_id. + * Immutable. Credential reference for accessing external storage system. Normalized as + * project_id.location_id.connection_id. * * @param connectionId connectionId or {@code null} for none */ public abstract Builder setConnectionId(@Nullable String connectionId); /** - * Immutable. Open source file format that the table data is stored in. - * Currently only PARQUET is supported. + * Immutable. Open source file format that the table data is stored in. Currently only PARQUET + * is supported. * * @param fileFormat fileFormat or {@code null} for none */ public abstract Builder setFileFormat(@Nullable String fileFormat); /** - * Immutable. Fully qualified location prefix of the external folder - * where data is stored. Starts with "gs://" and ends with "/". Does not contain "*". + * Immutable. Fully qualified location prefix of the external folder where data is stored. + * Starts with "gs://" and ends with "/". Does not contain "*". * * @param storageUri storageUri or {@code null} for none */ public abstract Builder setStorageUri(@Nullable String storageUri); /** - * Immutable. Open source file format that the table data is stored in. - * Currently only PARQUET is supported. + * Immutable. Open source table format that the table data is stored in. Currently only ICEBERG + * is supported. * * @param tableFormat tableFormat or {@code null} for none */ From 8fdd9bf4beab8954f0a99b5ee3e061327789f847 Mon Sep 17 00:00:00 2001 From: Keshav Dandeva Date: Mon, 13 Jul 2026 15:13:21 +0000 Subject: [PATCH 3/3] use `assertNull` instead of `assertEquals` --- .../bigquery/BigLakeConfigurationTest.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/BigLakeConfigurationTest.java b/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/BigLakeConfigurationTest.java index 31a1713a99b1..d74f06e4d34b 100644 --- a/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/BigLakeConfigurationTest.java +++ b/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/BigLakeConfigurationTest.java @@ -17,6 +17,7 @@ package com.google.cloud.bigquery; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; import org.junit.jupiter.api.Test; @@ -64,10 +65,10 @@ void testFromPb() { @Test void testNullFields() { BigLakeConfiguration configuration = BigLakeConfiguration.newBuilder().build(); - assertEquals(null, configuration.getConnectionId()); - assertEquals(null, configuration.getFileFormat()); - assertEquals(null, configuration.getStorageUri()); - assertEquals(null, configuration.getTableFormat()); + assertNull(configuration.getConnectionId()); + assertNull(configuration.getFileFormat()); + assertNull(configuration.getStorageUri()); + assertNull(configuration.getTableFormat()); } @Test @@ -75,10 +76,10 @@ void testFromPbWithNullFields() { com.google.api.services.bigquery.model.BigLakeConfiguration pb = new com.google.api.services.bigquery.model.BigLakeConfiguration(); BigLakeConfiguration configuration = BigLakeConfiguration.fromPb(pb); - assertEquals(null, configuration.getConnectionId()); - assertEquals(null, configuration.getFileFormat()); - assertEquals(null, configuration.getStorageUri()); - assertEquals(null, configuration.getTableFormat()); + assertNull(configuration.getConnectionId()); + assertNull(configuration.getFileFormat()); + assertNull(configuration.getStorageUri()); + assertNull(configuration.getTableFormat()); } private static void assertBigLakeConfiguration(