diff --git a/samples/pom.xml b/samples/pom.xml
index f5b000e9f..3a74ebd8a 100644
--- a/samples/pom.xml
+++ b/samples/pom.xml
@@ -27,7 +27,6 @@
com.google.cloud.samples
shared-configuration
1.0.11
-
diff --git a/samples/src/main/java/com/example/bigquery/RelaxColumnMode.java b/samples/src/main/java/com/example/bigquery/RelaxColumnMode.java
new file mode 100644
index 000000000..02a263127
--- /dev/null
+++ b/samples/src/main/java/com/example/bigquery/RelaxColumnMode.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2020 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.bigquery;
+
+import com.google.cloud.bigquery.BigQuery;
+import com.google.cloud.bigquery.BigQueryException;
+import com.google.cloud.bigquery.BigQueryOptions;
+import com.google.cloud.bigquery.Field;
+import com.google.cloud.bigquery.LegacySQLTypeName;
+import com.google.cloud.bigquery.Schema;
+import com.google.cloud.bigquery.StandardTableDefinition;
+import com.google.cloud.bigquery.Table;
+
+// [START bigquery_relax_column]
+public class RelaxColumnMode {
+
+ public static void runRelaxColumnMode() {
+ // TODO(developer): Replace these variables before running the sample.
+ String datasetName = "MY_DATASET_NAME";
+ String tableId = "MY_TABLE_NAME";
+ relaxColumnMode(datasetName, tableId);
+ }
+
+ public static void relaxColumnMode(String datasetName, String tableId) {
+ try {
+ // Initialize client that will be used to send requests. This client only needs to be created
+ // once, and can be reused for multiple requests.
+ BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
+
+ Table table = bigquery.getTable(datasetName, tableId);
+
+ // Create new relaxed schema based on the existing table schema
+ Schema relaxedSchema =
+ Schema.of(
+ // The only supported modification you can make to a column's mode is changing it from
+ // REQUIRED to NULLABLE
+ // Changing a column's mode from REQUIRED to NULLABLE is also called column relaxation
+ // INFO: LegacySQLTypeName will be updated to StandardSQLTypeName in release 1.103.0
+ Field.newBuilder("word", LegacySQLTypeName.STRING)
+ .setMode(Field.Mode.NULLABLE)
+ .build(),
+ Field.newBuilder("word_count", LegacySQLTypeName.STRING)
+ .setMode(Field.Mode.NULLABLE)
+ .build(),
+ Field.newBuilder("corpus", LegacySQLTypeName.STRING)
+ .setMode(Field.Mode.NULLABLE)
+ .build(),
+ Field.newBuilder("corpus_date", LegacySQLTypeName.STRING)
+ .setMode(Field.Mode.NULLABLE)
+ .build());
+
+ // Update the table with the new schema
+ Table updatedTable =
+ table.toBuilder().setDefinition(StandardTableDefinition.of(relaxedSchema)).build();
+ updatedTable.update();
+ System.out.println("Table schema successfully relaxed.");
+ } catch (BigQueryException e) {
+ System.out.println("Table schema not relaxed \n" + e.toString());
+ }
+ }
+}
+// [END bigquery_relax_column]
diff --git a/samples/src/test/java/com/example/bigquery/RelaxColumnModeIT.java b/samples/src/test/java/com/example/bigquery/RelaxColumnModeIT.java
new file mode 100644
index 000000000..1569e7b23
--- /dev/null
+++ b/samples/src/test/java/com/example/bigquery/RelaxColumnModeIT.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2020 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.bigquery;
+
+import static com.google.common.truth.Truth.assertThat;
+import static junit.framework.TestCase.assertNotNull;
+
+import com.google.cloud.bigquery.Field;
+import com.google.cloud.bigquery.Field.Mode;
+import com.google.cloud.bigquery.LegacySQLTypeName;
+import com.google.cloud.bigquery.Schema;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.util.UUID;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class RelaxColumnModeIT {
+ private ByteArrayOutputStream bout;
+ private PrintStream out;
+
+ private static final String BIGQUERY_DATASET_NAME = System.getenv("BIGQUERY_DATASET_NAME");
+
+ private static void requireEnvVar(String varName) {
+ assertNotNull(
+ "Environment variable " + varName + " is required to perform these tests.",
+ System.getenv(varName));
+ }
+
+ @BeforeClass
+ public static void checkRequirements() {
+ requireEnvVar("BIGQUERY_DATASET_NAME");
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ bout = new ByteArrayOutputStream();
+ out = new PrintStream(bout);
+ System.setOut(out);
+ }
+
+ @After
+ public void tearDown() {
+ System.setOut(null);
+ }
+
+ @Test
+ public void testRelaxColumnMode() {
+ // Create a new table with REQUIRED columns for each test to relax its column mode since this is
+ // a one-way operation
+ String generatedTableName =
+ "gcloud_test_table_temp_" + UUID.randomUUID().toString().replace('-', '_');
+ Schema originalSchema =
+ Schema.of(
+ // The only supported modification you can make to a column's mode is changing it from
+ // REQUIRED to NULLABLE
+ // Changing a column's mode from REQUIRED to NULLABLE is also called column relaxation
+ // INFO: LegacySQLTypeName will be updated to StandardSQLTypeName in release 1.103.0
+ Field.newBuilder("word", LegacySQLTypeName.STRING).setMode(Mode.REQUIRED).build(),
+ Field.newBuilder("word_count", LegacySQLTypeName.STRING)
+ .setMode(Field.Mode.REQUIRED)
+ .build(),
+ Field.newBuilder("corpus", LegacySQLTypeName.STRING)
+ .setMode(Field.Mode.REQUIRED)
+ .build(),
+ Field.newBuilder("corpus_date", LegacySQLTypeName.STRING)
+ .setMode(Field.Mode.REQUIRED)
+ .build());
+ CreateTable.createTable(BIGQUERY_DATASET_NAME, generatedTableName, originalSchema);
+
+ // Relax table column mode
+ RelaxColumnMode.relaxColumnMode(BIGQUERY_DATASET_NAME, generatedTableName);
+ assertThat(bout.toString()).contains("Table schema successfully relaxed.");
+ }
+}