diff --git a/docs/src/main/sphinx/connector/alter-schema-limitation.fragment b/docs/src/main/sphinx/connector/alter-schema-limitation.fragment new file mode 100644 index 000000000000..501301f4a663 --- /dev/null +++ b/docs/src/main/sphinx/connector/alter-schema-limitation.fragment @@ -0,0 +1,5 @@ +ALTER SCHEMA +^^^^^^^^^^^^ + +The connector supports renaming a schema with the ``ALTER SCHEMA RENAME`` +statement. ``ALTER SCHEMA SET AUTHORIZATION`` is not supported. diff --git a/docs/src/main/sphinx/connector/postgresql.rst b/docs/src/main/sphinx/connector/postgresql.rst index 69e013061830..4f82510ffc4e 100644 --- a/docs/src/main/sphinx/connector/postgresql.rst +++ b/docs/src/main/sphinx/connector/postgresql.rst @@ -146,6 +146,8 @@ statements, the connector supports the following features: .. include:: alter-table-limitation.fragment +.. include:: alter-schema-limitation.fragment + .. _postgresql-pushdown: Pushdown diff --git a/docs/src/main/sphinx/connector/redshift.rst b/docs/src/main/sphinx/connector/redshift.rst index 55f4d194c2dd..ad6db3a81010 100644 --- a/docs/src/main/sphinx/connector/redshift.rst +++ b/docs/src/main/sphinx/connector/redshift.rst @@ -98,11 +98,10 @@ statements, the connector supports the following features: * :doc:`/sql/insert` * :doc:`/sql/delete` * :doc:`/sql/truncate` -* :doc:`/sql/create-table` -* :doc:`/sql/create-table-as` -* :doc:`/sql/drop-table` -* :doc:`/sql/create-schema` -* :doc:`/sql/drop-schema` -* :doc:`/sql/comment` +* :ref:`sql-schema-table-management` .. include:: sql-delete-limitation.fragment + +.. include:: alter-table-limitation.fragment + +.. include:: alter-schema-limitation.fragment diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/BaseJdbcClient.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/BaseJdbcClient.java index ea3735df967c..1d674aaea8e8 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/BaseJdbcClient.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/BaseJdbcClient.java @@ -828,6 +828,25 @@ protected String dropSchemaSql(String schemaName) return "DROP SCHEMA " + quoted(schemaName); } + @Override + public void renameSchema(ConnectorSession session, String schemaName, String newSchemaName) + { + ConnectorIdentity identity = session.getIdentity(); + try (Connection connection = connectionFactory.openConnection(session)) { + String remoteSchemaName = identifierMapping.toRemoteSchemaName(identity, connection, schemaName); + String newRemoteSchemaName = identifierMapping.toRemoteSchemaName(identity, connection, newSchemaName); + execute(connection, renameSchemaSql(remoteSchemaName, newRemoteSchemaName)); + } + catch (SQLException e) { + throw new TrinoException(JDBC_ERROR, e); + } + } + + protected String renameSchemaSql(String remoteSchemaName, String newRemoteSchemaName) + { + return "ALTER SCHEMA " + quoted(remoteSchemaName) + " RENAME TO " + quoted(newRemoteSchemaName); + } + protected void execute(ConnectorSession session, String query) { try (Connection connection = connectionFactory.openConnection(session)) { diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/CachingJdbcClient.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/CachingJdbcClient.java index 73c33845e46c..dc3d510362bf 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/CachingJdbcClient.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/CachingJdbcClient.java @@ -365,6 +365,13 @@ public void dropSchema(ConnectorSession session, String schemaName) invalidateSchemasCache(); } + @Override + public void renameSchema(ConnectorSession session, String schemaName, String newSchemaName) + { + delegate.renameSchema(session, schemaName, newSchemaName); + invalidateSchemasCache(); + } + @Override public void setColumnComment(ConnectorSession session, JdbcTableHandle handle, JdbcColumnHandle column, Optional comment) { diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/DefaultJdbcMetadata.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/DefaultJdbcMetadata.java index ef49e3e596f1..a3d011355a4c 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/DefaultJdbcMetadata.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/DefaultJdbcMetadata.java @@ -790,4 +790,10 @@ public void dropSchema(ConnectorSession session, String schemaName) { jdbcClient.dropSchema(session, schemaName); } + + @Override + public void renameSchema(ConnectorSession session, String schemaName, String newSchemaName) + { + jdbcClient.renameSchema(session, schemaName, newSchemaName); + } } diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/ForwardingJdbcClient.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/ForwardingJdbcClient.java index 0ff945fd177b..13862d99bd73 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/ForwardingJdbcClient.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/ForwardingJdbcClient.java @@ -311,6 +311,12 @@ public void dropSchema(ConnectorSession session, String schemaName) delegate().dropSchema(session, schemaName); } + @Override + public void renameSchema(ConnectorSession session, String schemaName, String newSchemaName) + { + delegate().renameSchema(session, schemaName, newSchemaName); + } + @Override public Optional getSystemTable(ConnectorSession session, SchemaTableName tableName) { diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcClient.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcClient.java index 8b827c2c6692..14d33b09d300 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcClient.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcClient.java @@ -163,6 +163,8 @@ PreparedStatement getPreparedStatement(Connection connection, String sql) void dropSchema(ConnectorSession session, String schemaName); + void renameSchema(ConnectorSession session, String schemaName, String newSchemaName); + default Optional getSystemTable(ConnectorSession session, SchemaTableName tableName) { return Optional.empty(); diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/jmx/JdbcClientStats.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/jmx/JdbcClientStats.java index 26650bef19a2..cb9415a1e9d2 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/jmx/JdbcClientStats.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/jmx/JdbcClientStats.java @@ -32,6 +32,7 @@ public final class JdbcClientStats private final JdbcApiStats setColumnComment = new JdbcApiStats(); private final JdbcApiStats dropColumn = new JdbcApiStats(); private final JdbcApiStats dropSchema = new JdbcApiStats(); + private final JdbcApiStats renameSchema = new JdbcApiStats(); private final JdbcApiStats dropTable = new JdbcApiStats(); private final JdbcApiStats finishInsertTable = new JdbcApiStats(); private final JdbcApiStats getColumns = new JdbcApiStats(); @@ -154,6 +155,13 @@ public JdbcApiStats getDropSchema() return dropSchema; } + @Managed + @Nested + public JdbcApiStats getRenameSchema() + { + return renameSchema; + } + @Managed @Nested public JdbcApiStats getDropTable() diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/jmx/StatisticsAwareJdbcClient.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/jmx/StatisticsAwareJdbcClient.java index c3ad0824535c..ceb6b957fae3 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/jmx/StatisticsAwareJdbcClient.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/jmx/StatisticsAwareJdbcClient.java @@ -330,6 +330,12 @@ public void dropSchema(ConnectorSession session, String schemaName) stats.getDropSchema().wrap(() -> delegate().dropSchema(session, schemaName)); } + @Override + public void renameSchema(ConnectorSession session, String schemaName, String newSchemaName) + { + stats.getRenameSchema().wrap(() -> delegate().renameSchema(session, schemaName, newSchemaName)); + } + @Override public Optional getSystemTable(ConnectorSession session, SchemaTableName tableName) { diff --git a/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestJdbcCachingConnectorSmokeTest.java b/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestJdbcCachingConnectorSmokeTest.java index bad2a2a82dd2..486184e10801 100644 --- a/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestJdbcCachingConnectorSmokeTest.java +++ b/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestJdbcCachingConnectorSmokeTest.java @@ -131,7 +131,6 @@ protected boolean hasBehavior(TestingConnectorBehavior connectorBehavior) { switch (connectorBehavior) { case SUPPORTS_RENAME_TABLE_ACROSS_SCHEMAS: - case SUPPORTS_RENAME_SCHEMA: return false; default: diff --git a/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestJdbcConnectorTest.java b/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestJdbcConnectorTest.java index e73dc7bdbc60..6fdd94d87bec 100644 --- a/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestJdbcConnectorTest.java +++ b/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestJdbcConnectorTest.java @@ -58,7 +58,6 @@ protected boolean hasBehavior(TestingConnectorBehavior connectorBehavior) return false; case SUPPORTS_RENAME_TABLE_ACROSS_SCHEMAS: - case SUPPORTS_RENAME_SCHEMA: return false; case SUPPORTS_COMMENT_ON_TABLE: diff --git a/plugin/trino-clickhouse/src/main/java/io/trino/plugin/clickhouse/ClickHouseClient.java b/plugin/trino-clickhouse/src/main/java/io/trino/plugin/clickhouse/ClickHouseClient.java index 8d258e3c2536..16132074f70c 100644 --- a/plugin/trino-clickhouse/src/main/java/io/trino/plugin/clickhouse/ClickHouseClient.java +++ b/plugin/trino-clickhouse/src/main/java/io/trino/plugin/clickhouse/ClickHouseClient.java @@ -266,6 +266,13 @@ public void dropSchema(ConnectorSession session, String schemaName) execute(session, "DROP DATABASE " + quoted(schemaName)); } + @Override + public void renameSchema(ConnectorSession session, String schemaName, String newSchemaName) + { + // TODO: https://github.com/trinodb/trino/issues/10558 + throw new TrinoException(NOT_SUPPORTED, "This connector does not support renaming schemas"); + } + @Override public void addColumn(ConnectorSession session, JdbcTableHandle handle, ColumnMetadata column) { diff --git a/plugin/trino-druid/src/main/java/io/trino/plugin/druid/DruidJdbcClient.java b/plugin/trino-druid/src/main/java/io/trino/plugin/druid/DruidJdbcClient.java index fc3eb7c059ee..0782a0f1cc97 100644 --- a/plugin/trino-druid/src/main/java/io/trino/plugin/druid/DruidJdbcClient.java +++ b/plugin/trino-druid/src/main/java/io/trino/plugin/druid/DruidJdbcClient.java @@ -400,6 +400,12 @@ public void dropSchema(ConnectorSession session, String schemaName) throw new TrinoException(NOT_SUPPORTED, "This connector does not support dropping schemas"); } + @Override + public void renameSchema(ConnectorSession session, String schemaName, String newSchemaName) + { + throw new TrinoException(NOT_SUPPORTED, "This connector does not support renaming schemas"); + } + private WriteMapping legacyToWriteMapping(Type type) { // TODO (https://github.com/trinodb/trino/issues/497) Implement proper type mapping and add test diff --git a/plugin/trino-memsql/src/main/java/io/trino/plugin/memsql/MemSqlClient.java b/plugin/trino-memsql/src/main/java/io/trino/plugin/memsql/MemSqlClient.java index 89754fd5aefe..59084502084d 100644 --- a/plugin/trino-memsql/src/main/java/io/trino/plugin/memsql/MemSqlClient.java +++ b/plugin/trino-memsql/src/main/java/io/trino/plugin/memsql/MemSqlClient.java @@ -422,6 +422,12 @@ public void renameColumn(ConnectorSession session, JdbcTableHandle handle, JdbcC } } + @Override + public void renameSchema(ConnectorSession session, String schemaName, String newSchemaName) + { + throw new TrinoException(NOT_SUPPORTED, "This connector does not support renaming schemas"); + } + @Override protected String getTableSchemaName(ResultSet resultSet) throws SQLException diff --git a/plugin/trino-mysql/src/main/java/io/trino/plugin/mysql/MySqlClient.java b/plugin/trino-mysql/src/main/java/io/trino/plugin/mysql/MySqlClient.java index a2aa7322ac72..a672422cde9e 100644 --- a/plugin/trino-mysql/src/main/java/io/trino/plugin/mysql/MySqlClient.java +++ b/plugin/trino-mysql/src/main/java/io/trino/plugin/mysql/MySqlClient.java @@ -515,6 +515,12 @@ public void renameColumn(ConnectorSession session, JdbcTableHandle handle, JdbcC } } + @Override + public void renameSchema(ConnectorSession session, String schemaName, String newSchemaName) + { + throw new TrinoException(NOT_SUPPORTED, "This connector does not support renaming schemas"); + } + @Override protected void copyTableSchema(Connection connection, String catalogName, String schemaName, String tableName, String newTableName, List columnNames) { diff --git a/plugin/trino-oracle/src/main/java/io/trino/plugin/oracle/OracleClient.java b/plugin/trino-oracle/src/main/java/io/trino/plugin/oracle/OracleClient.java index 44d08a0cfb46..52d94753b7a8 100644 --- a/plugin/trino-oracle/src/main/java/io/trino/plugin/oracle/OracleClient.java +++ b/plugin/trino-oracle/src/main/java/io/trino/plugin/oracle/OracleClient.java @@ -244,6 +244,12 @@ public void dropSchema(ConnectorSession session, String schemaName) throw new TrinoException(NOT_SUPPORTED, "This connector does not support dropping schemas"); } + @Override + public void renameSchema(ConnectorSession session, String schemaName, String newSchemaName) + { + throw new TrinoException(NOT_SUPPORTED, "This connector does not support renaming schemas"); + } + @Override public Optional toColumnMapping(ConnectorSession session, Connection connection, JdbcTypeHandle typeHandle) { diff --git a/plugin/trino-phoenix/src/main/java/io/trino/plugin/phoenix/PhoenixClient.java b/plugin/trino-phoenix/src/main/java/io/trino/plugin/phoenix/PhoenixClient.java index 5cd3df98402d..5fe3a8686a06 100644 --- a/plugin/trino-phoenix/src/main/java/io/trino/plugin/phoenix/PhoenixClient.java +++ b/plugin/trino-phoenix/src/main/java/io/trino/plugin/phoenix/PhoenixClient.java @@ -621,6 +621,12 @@ protected void renameTable(ConnectorSession session, String catalogName, String throw new TrinoException(NOT_SUPPORTED, "This connector does not support renaming tables"); } + @Override + public void renameSchema(ConnectorSession session, String schemaName, String newSchemaName) + { + throw new TrinoException(NOT_SUPPORTED, "This connector does not support renaming schemas"); + } + @Override public Map getTableProperties(ConnectorSession session, JdbcTableHandle handle) { diff --git a/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixClient.java b/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixClient.java index 50446804e126..4e75b06fd453 100644 --- a/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixClient.java +++ b/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixClient.java @@ -613,6 +613,12 @@ protected void renameTable(ConnectorSession session, String catalogName, String throw new TrinoException(NOT_SUPPORTED, "This connector does not support renaming tables"); } + @Override + public void renameSchema(ConnectorSession session, String schemaName, String newSchemaName) + { + throw new TrinoException(NOT_SUPPORTED, "This connector does not support renaming schemas"); + } + @Override public Map getTableProperties(ConnectorSession session, JdbcTableHandle handle) { diff --git a/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestPostgreSqlConnectorTest.java b/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestPostgreSqlConnectorTest.java index ce47c0dbd89f..360f15589219 100644 --- a/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestPostgreSqlConnectorTest.java +++ b/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestPostgreSqlConnectorTest.java @@ -116,9 +116,6 @@ protected boolean hasBehavior(TestingConnectorBehavior connectorBehavior) case SUPPORTS_RENAME_TABLE_ACROSS_SCHEMAS: return false; - case SUPPORTS_RENAME_SCHEMA: - return false; - case SUPPORTS_CANCELLATION: return true; diff --git a/plugin/trino-sqlserver/src/main/java/io/trino/plugin/sqlserver/SqlServerClient.java b/plugin/trino-sqlserver/src/main/java/io/trino/plugin/sqlserver/SqlServerClient.java index 4f58691d8bbc..4f8874b91908 100644 --- a/plugin/trino-sqlserver/src/main/java/io/trino/plugin/sqlserver/SqlServerClient.java +++ b/plugin/trino-sqlserver/src/main/java/io/trino/plugin/sqlserver/SqlServerClient.java @@ -241,6 +241,12 @@ public void renameColumn(ConnectorSession session, JdbcTableHandle handle, JdbcC execute(session, sql); } + @Override + public void renameSchema(ConnectorSession session, String schemaName, String newSchemaName) + { + throw new TrinoException(NOT_SUPPORTED, "This connector does not support renaming schemas"); + } + @Override protected void copyTableSchema(Connection connection, String catalogName, String schemaName, String tableName, String newTableName, List columnNames) { diff --git a/testing/trino-testing/src/main/java/io/trino/testing/TestingConnectorBehavior.java b/testing/trino-testing/src/main/java/io/trino/testing/TestingConnectorBehavior.java index a7882d3ad2bb..49c4eebba4f4 100644 --- a/testing/trino-testing/src/main/java/io/trino/testing/TestingConnectorBehavior.java +++ b/testing/trino-testing/src/main/java/io/trino/testing/TestingConnectorBehavior.java @@ -46,7 +46,8 @@ public enum TestingConnectorBehavior SUPPORTS_JOIN_PUSHDOWN_WITH_VARCHAR_EQUALITY(fallback -> fallback.test(SUPPORTS_JOIN_PUSHDOWN) && fallback.test(SUPPORTS_PREDICATE_PUSHDOWN_WITH_VARCHAR_EQUALITY)), SUPPORTS_JOIN_PUSHDOWN_WITH_VARCHAR_INEQUALITY(fallback -> fallback.test(SUPPORTS_JOIN_PUSHDOWN) && fallback.test(SUPPORTS_PREDICATE_PUSHDOWN_WITH_VARCHAR_INEQUALITY)), SUPPORTS_CREATE_SCHEMA, - SUPPORTS_RENAME_SCHEMA, + // Expect rename to be supported when create schema is supported, to help make connector implementations coherent. + SUPPORTS_RENAME_SCHEMA(SUPPORTS_CREATE_SCHEMA), SUPPORTS_CREATE_TABLE, SUPPORTS_CREATE_TABLE_WITH_DATA(SUPPORTS_CREATE_TABLE),