Skip to content

Commit 269e9de

Browse files
committed
Add support for CREATE and DROP SCHEMA in BigQuery
1 parent f4dcf75 commit 269e9de

File tree

4 files changed

+89
-0
lines changed

4 files changed

+89
-0
lines changed

plugin/trino-bigquery/src/main/java/io/trino/plugin/bigquery/BigQueryClient.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,16 @@ Table update(TableInfo table)
207207
return bigQuery.update(table);
208208
}
209209

210+
public void createSchema(DatasetInfo datasetInfo)
211+
{
212+
bigQuery.create(datasetInfo);
213+
}
214+
215+
public void dropSchema(DatasetId datasetId)
216+
{
217+
bigQuery.delete(datasetId);
218+
}
219+
210220
public void createTable(TableInfo tableInfo)
211221
{
212222
bigQuery.create(tableInfo);

plugin/trino-bigquery/src/main/java/io/trino/plugin/bigquery/BigQueryMetadata.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import com.google.cloud.bigquery.BigQueryException;
1717
import com.google.cloud.bigquery.DatasetId;
18+
import com.google.cloud.bigquery.DatasetInfo;
1819
import com.google.cloud.bigquery.Field;
1920
import com.google.cloud.bigquery.Schema;
2021
import com.google.cloud.bigquery.StandardTableDefinition;
@@ -44,12 +45,14 @@
4445
import io.trino.spi.connector.LimitApplicationResult;
4546
import io.trino.spi.connector.ProjectionApplicationResult;
4647
import io.trino.spi.connector.RecordCursor;
48+
import io.trino.spi.connector.SchemaNotFoundException;
4749
import io.trino.spi.connector.SchemaTableName;
4850
import io.trino.spi.connector.SchemaTablePrefix;
4951
import io.trino.spi.connector.SystemTable;
5052
import io.trino.spi.connector.TableNotFoundException;
5153
import io.trino.spi.expression.ConnectorExpression;
5254
import io.trino.spi.predicate.TupleDomain;
55+
import io.trino.spi.security.TrinoPrincipal;
5356
import io.trino.spi.type.Type;
5457
import io.trino.spi.type.VarcharType;
5558

@@ -64,6 +67,7 @@
6467

6568
import static com.google.cloud.bigquery.TableDefinition.Type.TABLE;
6669
import static com.google.cloud.bigquery.TableDefinition.Type.VIEW;
70+
import static com.google.common.base.Preconditions.checkArgument;
6771
import static com.google.common.collect.ImmutableList.toImmutableList;
6872
import static com.google.common.collect.ImmutableMap.toImmutableMap;
6973
import static io.trino.plugin.bigquery.BigQueryType.toField;
@@ -293,6 +297,23 @@ public ConnectorTableProperties getTableProperties(ConnectorSession session, Con
293297
return new ConnectorTableProperties();
294298
}
295299

300+
@Override
301+
public void createSchema(ConnectorSession session, String schemaName, Map<String, Object> properties, TrinoPrincipal owner)
302+
{
303+
checkArgument(properties.isEmpty(), "Can't have properties for schema creation");
304+
DatasetInfo datasetInfo = DatasetInfo.newBuilder(schemaName).build();
305+
bigQueryClient.createSchema(datasetInfo);
306+
}
307+
308+
@Override
309+
public void dropSchema(ConnectorSession session, String schemaName)
310+
{
311+
String remoteSchemaName = bigQueryClient.toRemoteDataset(projectId, schemaName)
312+
.map(RemoteDatabaseObject::getOnlyRemoteName)
313+
.orElseThrow(() -> new SchemaNotFoundException(schemaName));
314+
bigQueryClient.dropSchema(DatasetId.of(remoteSchemaName));
315+
}
316+
296317
@Override
297318
public void createTable(ConnectorSession session, ConnectorTableMetadata tableMetadata, boolean ignoreExisting)
298319
{

plugin/trino-bigquery/src/test/java/io/trino/plugin/bigquery/TestBigQueryCaseInsensitiveMapping.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,31 @@ public void testTableNameClash()
172172
}
173173
}
174174

175+
@Test
176+
public void testDropSchema()
177+
{
178+
String schema = "Test_Drop_Case_Sensitive";
179+
bigQuerySqlExecutor.execute(format("DROP SCHEMA IF EXISTS `%s`", schema));
180+
bigQuerySqlExecutor.execute(format("CREATE SCHEMA `%s`", schema));
181+
182+
assertUpdate("DROP SCHEMA " + schema.toLowerCase(ENGLISH));
183+
}
184+
185+
@Test
186+
public void testDropSchemaNameClash()
187+
{
188+
String schema = "Test_Drop_Case_Sensitive_Clash";
189+
bigQuerySqlExecutor.execute(format("DROP SCHEMA IF EXISTS `%s`", schema));
190+
bigQuerySqlExecutor.execute(format("DROP SCHEMA IF EXISTS `%s`", schema.toLowerCase(ENGLISH)));
191+
bigQuerySqlExecutor.execute(format("CREATE SCHEMA `%s`", schema));
192+
bigQuerySqlExecutor.execute(format("CREATE SCHEMA `%s`", schema.toLowerCase(ENGLISH)));
193+
194+
assertQueryFails("DROP SCHEMA " + schema.toLowerCase(ENGLISH), "Found ambiguous names in BigQuery.*");
195+
196+
bigQuerySqlExecutor.execute(format("DROP SCHEMA `%s`", schema));
197+
bigQuerySqlExecutor.execute(format("DROP SCHEMA `%s`", schema.toLowerCase(ENGLISH)));
198+
}
199+
175200
private AutoCloseable withSchema(String schemaName)
176201
{
177202
bigQuerySqlExecutor.createDataset(schemaName);

plugin/trino-bigquery/src/test/java/io/trino/plugin/bigquery/TestBigQueryIntegrationSmokeTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,39 @@ protected QueryRunner createQueryRunner()
4747
ImmutableMap.of());
4848
}
4949

50+
@Test
51+
public void testCreateSchema()
52+
{
53+
String schemaName = "test_create_schema";
54+
55+
assertUpdate("DROP SCHEMA IF EXISTS " + schemaName);
56+
57+
assertUpdate("CREATE SCHEMA " + schemaName);
58+
assertUpdate("CREATE SCHEMA IF NOT EXISTS " + schemaName);
59+
60+
assertQueryFails(
61+
"CREATE SCHEMA " + schemaName,
62+
format("\\Qline 1:1: Schema 'bigquery.%s' already exists\\E", schemaName));
63+
64+
assertUpdate("DROP SCHEMA " + schemaName);
65+
}
66+
67+
@Test
68+
public void testDropSchema()
69+
{
70+
String schemaName = "test_drop_schema";
71+
72+
assertUpdate("DROP SCHEMA IF EXISTS " + schemaName);
73+
assertUpdate("CREATE SCHEMA " + schemaName);
74+
75+
assertUpdate("DROP SCHEMA " + schemaName);
76+
assertUpdate("DROP SCHEMA IF EXISTS " + schemaName);
77+
78+
assertQueryFails(
79+
"DROP SCHEMA " + schemaName,
80+
format("\\Qline 1:1: Schema 'bigquery.%s' does not exist\\E", schemaName));
81+
}
82+
5083
@Override
5184
public void testDescribeTable()
5285
{

0 commit comments

Comments
 (0)