From 68ef2bb3c61d0b3612b2e7ff1776db8c68d6b8b0 Mon Sep 17 00:00:00 2001 From: Reetika Agrawal Date: Tue, 14 Jan 2025 01:25:41 +0530 Subject: [PATCH] Add support for SHOW CREATE SCHEMA --- presto-docs/src/main/sphinx/sql.rst | 1 + .../main/sphinx/sql/show-create-schema.rst | 37 +++++++++++++++++++ .../facebook/presto/hive/HiveMetadata.java | 14 +++++++ .../presto/hive/HiveSchemaProperties.java | 9 +++++ .../hive/TestHiveIntegrationSmokeTest.java | 14 +++++++ .../presto/iceberg/IcebergHiveMetadata.java | 13 +++++++ .../iceberg/hive/TestIcebergSmokeHive.java | 19 ++++++++++ .../metadata/DelegatingMetadataManager.java | 6 +++ .../facebook/presto/metadata/Metadata.java | 5 +++ .../presto/metadata/MetadataManager.java | 17 +++++++++ .../sql/rewrite/ShowQueriesRewrite.java | 20 ++++++++++ .../presto/metadata/AbstractMockMetadata.java | 6 +++ .../com/facebook/presto/sql/parser/SqlBase.g4 | 1 + .../com/facebook/presto/sql/SqlFormatter.java | 4 ++ .../presto/sql/parser/AstBuilder.java | 6 +++ .../facebook/presto/sql/tree/ShowCreate.java | 1 + .../presto/sql/parser/TestSqlParser.java | 8 ++++ .../spi/connector/ConnectorMetadata.java | 9 +++++ .../ClassLoaderSafeConnectorMetadata.java | 9 +++++ 19 files changed, 199 insertions(+) create mode 100644 presto-docs/src/main/sphinx/sql/show-create-schema.rst diff --git a/presto-docs/src/main/sphinx/sql.rst b/presto-docs/src/main/sphinx/sql.rst index 84b7ced26d1b7..c18015a1444c5 100644 --- a/presto-docs/src/main/sphinx/sql.rst +++ b/presto-docs/src/main/sphinx/sql.rst @@ -47,6 +47,7 @@ This chapter describes the SQL syntax used in Presto. sql/show-catalogs sql/show-columns sql/show-create-function + sql/show-create-schema sql/show-create-table sql/show-create-view sql/show-functions diff --git a/presto-docs/src/main/sphinx/sql/show-create-schema.rst b/presto-docs/src/main/sphinx/sql/show-create-schema.rst new file mode 100644 index 0000000000000..814bf632e2122 --- /dev/null +++ b/presto-docs/src/main/sphinx/sql/show-create-schema.rst @@ -0,0 +1,37 @@ +================= +SHOW CREATE SCHEMA +================= + +Synopsis +-------- + +.. code-block:: none + + SHOW CREATE SCHEMA schema_name + +Description +----------- + +Show the SQL statement that creates the specified schema. + +Examples +-------- + +Show the SQL that can be run to create the ``sf1`` schema:: + + SHOW CREATE SCHEMA hive.sf1; + +.. code-block:: none + + Create Schema + ----------------------------------------- + CREATE SCHEMA hive.sf1 + WITH ( + location = 'hdfs://localhost:9000/user/hive/warehouse/sf1.db' + ) + (1 row) + +See Also +-------- + +:doc:`create-schema` diff --git a/presto-hive/src/main/java/com/facebook/presto/hive/HiveMetadata.java b/presto-hive/src/main/java/com/facebook/presto/hive/HiveMetadata.java index 3d3a0eacd4d44..bdc986ae450a9 100644 --- a/presto-hive/src/main/java/com/facebook/presto/hive/HiveMetadata.java +++ b/presto-hive/src/main/java/com/facebook/presto/hive/HiveMetadata.java @@ -15,6 +15,7 @@ import com.facebook.airlift.json.JsonCodec; import com.facebook.airlift.json.smile.SmileCodec; +import com.facebook.presto.common.CatalogSchemaName; import com.facebook.presto.common.Subfield; import com.facebook.presto.common.predicate.NullableValue; import com.facebook.presto.common.predicate.TupleDomain; @@ -65,6 +66,7 @@ import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.QueryId; import com.facebook.presto.spi.RecordCursor; +import com.facebook.presto.spi.SchemaNotFoundException; import com.facebook.presto.spi.SchemaTableName; import com.facebook.presto.spi.SchemaTablePrefix; import com.facebook.presto.spi.SortingProperty; @@ -201,6 +203,7 @@ import static com.facebook.presto.hive.HivePartition.UNPARTITIONED_ID; import static com.facebook.presto.hive.HivePartitioningHandle.createHiveCompatiblePartitioningHandle; import static com.facebook.presto.hive.HivePartitioningHandle.createPrestoNativePartitioningHandle; +import static com.facebook.presto.hive.HiveSchemaProperties.getDatabaseProperties; import static com.facebook.presto.hive.HiveSessionProperties.HIVE_STORAGE_FORMAT; import static com.facebook.presto.hive.HiveSessionProperties.RESPECT_TABLE_FORMAT; import static com.facebook.presto.hive.HiveSessionProperties.getBucketFunctionTypeForExchange; @@ -502,6 +505,17 @@ public List listSchemaNames(ConnectorSession session) return metastore.getAllDatabases(getMetastoreContext(session)); } + @Override + public Map getSchemaProperties(ConnectorSession session, CatalogSchemaName schemaName) + { + MetastoreContext metastoreContext = getMetastoreContext(session); + Optional database = metastore.getDatabase(metastoreContext, schemaName.getSchemaName()); + if (database.isPresent()) { + return getDatabaseProperties(database.get()); + } + throw new SchemaNotFoundException(schemaName.getSchemaName()); + } + @Override public HiveTableHandle getTableHandle(ConnectorSession session, SchemaTableName tableName) { diff --git a/presto-hive/src/main/java/com/facebook/presto/hive/HiveSchemaProperties.java b/presto-hive/src/main/java/com/facebook/presto/hive/HiveSchemaProperties.java index 12709fa0b234c..976a6ed65b33d 100644 --- a/presto-hive/src/main/java/com/facebook/presto/hive/HiveSchemaProperties.java +++ b/presto-hive/src/main/java/com/facebook/presto/hive/HiveSchemaProperties.java @@ -13,8 +13,10 @@ */ package com.facebook.presto.hive; +import com.facebook.presto.hive.metastore.Database; import com.facebook.presto.spi.session.PropertyMetadata; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import java.util.List; import java.util.Map; @@ -39,4 +41,11 @@ public static Optional getLocation(Map schemaProperties) { return Optional.ofNullable((String) schemaProperties.get(LOCATION_PROPERTY)); } + + public static Map getDatabaseProperties(Database database) + { + ImmutableMap.Builder result = ImmutableMap.builder(); + database.getLocation().ifPresent(location -> result.put(LOCATION_PROPERTY, location)); + return result.build(); + } } diff --git a/presto-hive/src/test/java/com/facebook/presto/hive/TestHiveIntegrationSmokeTest.java b/presto-hive/src/test/java/com/facebook/presto/hive/TestHiveIntegrationSmokeTest.java index fa2a064dc9581..8821f34ee683a 100644 --- a/presto-hive/src/test/java/com/facebook/presto/hive/TestHiveIntegrationSmokeTest.java +++ b/presto-hive/src/test/java/com/facebook/presto/hive/TestHiveIntegrationSmokeTest.java @@ -2781,6 +2781,20 @@ public void testShowCreateTable() actualResult = computeActual("SHOW CREATE TABLE \"test_show_create_table'2\""); assertEquals(getOnlyElement(actualResult.getOnlyColumnAsSet()), createTableSql); } + @Test + public void testShowCreateSchema() + { + String createSchemaSql = "CREATE SCHEMA show_create_hive_schema"; + assertUpdate(createSchemaSql); + String expectedShowCreateSchema = "CREATE SCHEMA show_create_hive_schema\n" + + "WITH (\n" + + " location = '.*show_create_hive_schema'\n" + + ")"; + + MaterializedResult actualResult = computeActual("SHOW CREATE SCHEMA show_create_hive_schema"); + assertThat(getOnlyElement(actualResult.getOnlyColumnAsSet()).toString().matches(expectedShowCreateSchema)); + assertUpdate("DROP SCHEMA show_create_hive_schema"); + } @Test public void testTextfileAmbiguousTimestamp() diff --git a/presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergHiveMetadata.java b/presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergHiveMetadata.java index f1f3777613a7a..b50e3f0347156 100644 --- a/presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergHiveMetadata.java +++ b/presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergHiveMetadata.java @@ -14,6 +14,7 @@ package com.facebook.presto.iceberg; import com.facebook.airlift.json.JsonCodec; +import com.facebook.presto.common.CatalogSchemaName; import com.facebook.presto.common.type.Type; import com.facebook.presto.common.type.TypeManager; import com.facebook.presto.hive.HdfsContext; @@ -87,6 +88,7 @@ import java.util.TimeZone; import java.util.stream.Stream; +import static com.facebook.presto.hive.HiveSchemaProperties.getDatabaseProperties; import static com.facebook.presto.hive.HiveStatisticsUtil.createPartitionStatistics; import static com.facebook.presto.hive.HiveStatisticsUtil.updatePartitionStatistics; import static com.facebook.presto.hive.HiveUtil.decodeViewData; @@ -208,6 +210,17 @@ public List listSchemaNames(ConnectorSession session) return metastore.getAllDatabases(getMetastoreContext(session)); } + @Override + public Map getSchemaProperties(ConnectorSession session, CatalogSchemaName schemaName) + { + MetastoreContext metastoreContext = getMetastoreContext(session); + Optional database = metastore.getDatabase(metastoreContext, schemaName.getSchemaName()); + if (database.isPresent()) { + return getDatabaseProperties(database.get()); + } + throw new SchemaNotFoundException(schemaName.getSchemaName()); + } + @Override public List listTables(ConnectorSession session, Optional schemaName) { diff --git a/presto-iceberg/src/test/java/com/facebook/presto/iceberg/hive/TestIcebergSmokeHive.java b/presto-iceberg/src/test/java/com/facebook/presto/iceberg/hive/TestIcebergSmokeHive.java index d83095286dfa7..419f0ea3a65f4 100644 --- a/presto-iceberg/src/test/java/com/facebook/presto/iceberg/hive/TestIcebergSmokeHive.java +++ b/presto-iceberg/src/test/java/com/facebook/presto/iceberg/hive/TestIcebergSmokeHive.java @@ -28,9 +28,11 @@ import com.facebook.presto.iceberg.IcebergUtil; import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.SchemaTableName; +import com.facebook.presto.testing.MaterializedResult; import com.facebook.presto.tests.DistributedQueryRunner; import com.google.common.collect.ImmutableSet; import org.apache.iceberg.Table; +import org.testng.annotations.Test; import java.io.File; import java.nio.file.Path; @@ -38,7 +40,9 @@ import static com.facebook.presto.hive.metastore.InMemoryCachingHiveMetastore.memoizeMetastore; import static com.facebook.presto.iceberg.CatalogType.HIVE; import static com.facebook.presto.iceberg.IcebergQueryRunner.getIcebergDataDirectoryPath; +import static com.google.common.collect.Iterables.getOnlyElement; import static java.lang.String.format; +import static org.assertj.core.api.Assertions.assertThat; public class TestIcebergSmokeHive extends IcebergDistributedSmokeTestBase @@ -83,4 +87,19 @@ protected Table getIcebergTable(ConnectorSession session, String schema, String session, SchemaTableName.valueOf(schema + "." + tableName)); } + + @Test + public void testShowCreateSchema() + { + String createSchemaSql = "CREATE SCHEMA show_create_iceberg_schema"; + assertUpdate(createSchemaSql); + String expectedShowCreateSchema = "CREATE SCHEMA show_create_iceberg_schema\n" + + "WITH (\n" + + " location = '.*show_create_iceberg_schema'\n" + + ")"; + + MaterializedResult actualResult = computeActual("SHOW CREATE SCHEMA show_create_iceberg_schema"); + assertThat(getOnlyElement(actualResult.getOnlyColumnAsSet()).toString().matches(expectedShowCreateSchema)); + assertUpdate("DROP SCHEMA show_create_iceberg_schema"); + } } diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/DelegatingMetadataManager.java b/presto-main/src/main/java/com/facebook/presto/metadata/DelegatingMetadataManager.java index 83cd4594032f5..58adb145011d5 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/DelegatingMetadataManager.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/DelegatingMetadataManager.java @@ -95,6 +95,12 @@ public List listSchemaNames(Session session, String catalogName) return delegate.listSchemaNames(session, catalogName); } + @Override + public Map getSchemaProperties(Session session, CatalogSchemaName schemaName) + { + return delegate.getSchemaProperties(session, schemaName); + } + @Override public Optional getSystemTable(Session session, QualifiedObjectName tableName) { diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/Metadata.java b/presto-main/src/main/java/com/facebook/presto/metadata/Metadata.java index 4f3f698be42c9..85154b3688f1a 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/Metadata.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/Metadata.java @@ -74,6 +74,11 @@ public interface Metadata List listSchemaNames(Session session, String catalogName); + /** + * Gets the schema properties for the specified schema. + */ + Map getSchemaProperties(Session session, CatalogSchemaName schemaName); + Optional getSystemTable(Session session, QualifiedObjectName tableName); /** diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/MetadataManager.java b/presto-main/src/main/java/com/facebook/presto/metadata/MetadataManager.java index 3041d3990fdf8..ae6bcdad93a1b 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/MetadataManager.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/MetadataManager.java @@ -73,6 +73,7 @@ import com.facebook.presto.spi.statistics.TableStatisticsMetadata; import com.facebook.presto.sql.analyzer.FeaturesConfig; import com.facebook.presto.sql.analyzer.FunctionsConfig; +import com.facebook.presto.sql.analyzer.SemanticException; import com.facebook.presto.sql.analyzer.TypeSignatureProvider; import com.facebook.presto.transaction.TransactionManager; import com.facebook.presto.type.TypeDeserializer; @@ -129,6 +130,7 @@ import static com.facebook.presto.spi.StandardErrorCode.SYNTAX_ERROR; import static com.facebook.presto.spi.TableLayoutFilterCoverage.NOT_APPLICABLE; import static com.facebook.presto.spi.analyzer.ViewDefinition.ViewColumn; +import static com.facebook.presto.sql.analyzer.SemanticErrorCode.MISSING_SCHEMA; import static com.facebook.presto.sql.analyzer.TypeSignatureProvider.fromTypes; import static com.facebook.presto.transaction.InMemoryTransactionManager.createTestTransactionManager; import static com.google.common.base.Preconditions.checkArgument; @@ -318,6 +320,21 @@ public List listSchemaNames(Session session, String catalogName) return ImmutableList.copyOf(schemaNames.build()); } + @Override + public Map getSchemaProperties(Session session, CatalogSchemaName schemaName) + { + if (!getMetadataResolver(session).schemaExists(schemaName)) { + throw new SemanticException(MISSING_SCHEMA, format("Schema '%s' does not exist", schemaName)); + } + + Optional catalog = getOptionalCatalogMetadata(session, transactionManager, schemaName.getCatalogName()); + CatalogMetadata catalogMetadata = catalog.get(); + ConnectorSession connectorSession = session.toConnectorSession(catalogMetadata.getConnectorId()); + ConnectorMetadata metadata = catalogMetadata.getMetadataFor(catalogMetadata.getConnectorId()); + + return metadata.getSchemaProperties(connectorSession, schemaName); + } + @Override public Optional getTableHandleForStatisticsCollection(Session session, QualifiedObjectName table, Map analyzeProperties) { diff --git a/presto-main/src/main/java/com/facebook/presto/sql/rewrite/ShowQueriesRewrite.java b/presto-main/src/main/java/com/facebook/presto/sql/rewrite/ShowQueriesRewrite.java index 0b56b19409727..ab2573831ad4b 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/rewrite/ShowQueriesRewrite.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/rewrite/ShowQueriesRewrite.java @@ -53,6 +53,7 @@ import com.facebook.presto.sql.tree.ConstraintSpecification; import com.facebook.presto.sql.tree.CreateFunction; import com.facebook.presto.sql.tree.CreateMaterializedView; +import com.facebook.presto.sql.tree.CreateSchema; import com.facebook.presto.sql.tree.CreateTable; import com.facebook.presto.sql.tree.CreateView; import com.facebook.presto.sql.tree.DoubleLiteral; @@ -113,10 +114,12 @@ import static com.facebook.presto.metadata.MetadataUtil.createCatalogSchemaName; import static com.facebook.presto.metadata.MetadataUtil.createQualifiedName; import static com.facebook.presto.metadata.MetadataUtil.createQualifiedObjectName; +import static com.facebook.presto.metadata.MetadataUtil.getConnectorIdOrThrow; import static com.facebook.presto.metadata.SessionFunctionHandle.SESSION_NAMESPACE; import static com.facebook.presto.spi.StandardErrorCode.FUNCTION_NOT_FOUND; import static com.facebook.presto.spi.StandardErrorCode.GENERIC_USER_ERROR; import static com.facebook.presto.spi.StandardErrorCode.INVALID_COLUMN_PROPERTY; +import static com.facebook.presto.spi.StandardErrorCode.INVALID_SCHEMA_PROPERTY; import static com.facebook.presto.spi.StandardErrorCode.INVALID_TABLE_PROPERTY; import static com.facebook.presto.sql.ExpressionUtils.combineConjuncts; import static com.facebook.presto.sql.QueryUtil.aliased; @@ -151,6 +154,7 @@ import static com.facebook.presto.sql.tree.RoutineCharacteristics.Language; import static com.facebook.presto.sql.tree.RoutineCharacteristics.NullCallClause; import static com.facebook.presto.sql.tree.ShowCreate.Type.MATERIALIZED_VIEW; +import static com.facebook.presto.sql.tree.ShowCreate.Type.SCHEMA; import static com.facebook.presto.sql.tree.ShowCreate.Type.TABLE; import static com.facebook.presto.sql.tree.ShowCreate.Type.VIEW; import static com.facebook.presto.util.AnalyzerUtil.createParsingOptions; @@ -581,6 +585,22 @@ else if (constraint instanceof UniqueConstraint) { return singleValueQuery("Create Table", formatSql(createTable, Optional.of(parameters)).trim()); } + if (node.getType() == SCHEMA) { + CatalogSchemaName catalogSchemaName = createCatalogSchemaName(session, node, Optional.of(node.getName())); + if (!metadataResolver.schemaExists(catalogSchemaName)) { + throw new SemanticException(MISSING_SCHEMA, node, "Schema '%s' does not exist", catalogSchemaName); + } + + Map properties = metadata.getSchemaProperties(session, catalogSchemaName); + Map> allTableProperties = metadata.getSchemaPropertyManager().getAllProperties().get(getConnectorIdOrThrow(session, metadata, catalogSchemaName.getCatalogName())); + List propertyNodes = buildProperties(objectName, Optional.empty(), INVALID_SCHEMA_PROPERTY, properties, allTableProperties); + CreateSchema createSchema = new CreateSchema( + node.getName(), + false, + propertyNodes); + return singleValueQuery("Create Schema", formatSql(createSchema, Optional.of(parameters)).trim()); + } + throw new UnsupportedOperationException("SHOW CREATE only supported for tables and views"); } diff --git a/presto-main/src/test/java/com/facebook/presto/metadata/AbstractMockMetadata.java b/presto-main/src/test/java/com/facebook/presto/metadata/AbstractMockMetadata.java index 49a6051c22362..6521ea2417169 100644 --- a/presto-main/src/test/java/com/facebook/presto/metadata/AbstractMockMetadata.java +++ b/presto-main/src/test/java/com/facebook/presto/metadata/AbstractMockMetadata.java @@ -140,6 +140,12 @@ public List listSchemaNames(Session session, String catalogName) throw new UnsupportedOperationException(); } + @Override + public Map getSchemaProperties(Session session, CatalogSchemaName schemaName) + { + throw new UnsupportedOperationException(); + } + @Override public Optional getTableHandleForStatisticsCollection(Session session, QualifiedObjectName tableName, Map analyzeProperties) { diff --git a/presto-parser/src/main/antlr4/com/facebook/presto/sql/parser/SqlBase.g4 b/presto-parser/src/main/antlr4/com/facebook/presto/sql/parser/SqlBase.g4 index e5ee6b44b9a40..f0c4da0bd80d9 100644 --- a/presto-parser/src/main/antlr4/com/facebook/presto/sql/parser/SqlBase.g4 +++ b/presto-parser/src/main/antlr4/com/facebook/presto/sql/parser/SqlBase.g4 @@ -118,6 +118,7 @@ statement | EXPLAIN ANALYZE? VERBOSE? ('(' explainOption (',' explainOption)* ')')? statement #explain | SHOW CREATE TABLE qualifiedName #showCreateTable + | SHOW CREATE SCHEMA qualifiedName #showCreateSchema | SHOW CREATE VIEW qualifiedName #showCreateView | SHOW CREATE MATERIALIZED VIEW qualifiedName #showCreateMaterializedView | SHOW CREATE FUNCTION qualifiedName types? #showCreateFunction diff --git a/presto-parser/src/main/java/com/facebook/presto/sql/SqlFormatter.java b/presto-parser/src/main/java/com/facebook/presto/sql/SqlFormatter.java index 29553e2bc4c95..b4aa019504db0 100644 --- a/presto-parser/src/main/java/com/facebook/presto/sql/SqlFormatter.java +++ b/presto-parser/src/main/java/com/facebook/presto/sql/SqlFormatter.java @@ -858,6 +858,10 @@ protected Void visitShowCreate(ShowCreate node, Integer context) builder.append("SHOW CREATE TABLE ") .append(formatName(node.getName())); } + else if (node.getType() == ShowCreate.Type.SCHEMA) { + builder.append("SHOW CREATE SCHEMA ") + .append(formatName(node.getName())); + } else if (node.getType() == ShowCreate.Type.VIEW) { builder.append("SHOW CREATE VIEW ") .append(formatName(node.getName())); diff --git a/presto-parser/src/main/java/com/facebook/presto/sql/parser/AstBuilder.java b/presto-parser/src/main/java/com/facebook/presto/sql/parser/AstBuilder.java index 7b1dd90a57f5e..9d9b2bcdea006 100644 --- a/presto-parser/src/main/java/com/facebook/presto/sql/parser/AstBuilder.java +++ b/presto-parser/src/main/java/com/facebook/presto/sql/parser/AstBuilder.java @@ -375,6 +375,12 @@ public Node visitShowCreateTable(SqlBaseParser.ShowCreateTableContext context) return new ShowCreate(getLocation(context), ShowCreate.Type.TABLE, getQualifiedName(context.qualifiedName())); } + @Override + public Node visitShowCreateSchema(SqlBaseParser.ShowCreateSchemaContext context) + { + return new ShowCreate(getLocation(context), ShowCreate.Type.SCHEMA, getQualifiedName(context.qualifiedName())); + } + @Override public Node visitShowCreateFunction(SqlBaseParser.ShowCreateFunctionContext context) { diff --git a/presto-parser/src/main/java/com/facebook/presto/sql/tree/ShowCreate.java b/presto-parser/src/main/java/com/facebook/presto/sql/tree/ShowCreate.java index ef6501450d5ad..976ccede93944 100644 --- a/presto-parser/src/main/java/com/facebook/presto/sql/tree/ShowCreate.java +++ b/presto-parser/src/main/java/com/facebook/presto/sql/tree/ShowCreate.java @@ -28,6 +28,7 @@ public class ShowCreate public enum Type { TABLE, + SCHEMA, VIEW, MATERIALIZED_VIEW } diff --git a/presto-parser/src/test/java/com/facebook/presto/sql/parser/TestSqlParser.java b/presto-parser/src/test/java/com/facebook/presto/sql/parser/TestSqlParser.java index 68b590834653d..05a5fc78c8748 100644 --- a/presto-parser/src/test/java/com/facebook/presto/sql/parser/TestSqlParser.java +++ b/presto-parser/src/test/java/com/facebook/presto/sql/parser/TestSqlParser.java @@ -126,6 +126,7 @@ import com.facebook.presto.sql.tree.SetSession; import com.facebook.presto.sql.tree.ShowCatalogs; import com.facebook.presto.sql.tree.ShowColumns; +import com.facebook.presto.sql.tree.ShowCreate; import com.facebook.presto.sql.tree.ShowCreateFunction; import com.facebook.presto.sql.tree.ShowFunctions; import com.facebook.presto.sql.tree.ShowGrants; @@ -195,6 +196,7 @@ import static com.facebook.presto.sql.tree.RoutineCharacteristics.Language.SQL; import static com.facebook.presto.sql.tree.RoutineCharacteristics.NullCallClause.CALLED_ON_NULL_INPUT; import static com.facebook.presto.sql.tree.RoutineCharacteristics.NullCallClause.RETURNS_NULL_ON_NULL_INPUT; +import static com.facebook.presto.sql.tree.ShowCreate.Type.SCHEMA; import static com.facebook.presto.sql.tree.SortItem.NullOrdering.UNDEFINED; import static com.facebook.presto.sql.tree.SortItem.Ordering.ASCENDING; import static com.facebook.presto.sql.tree.SortItem.Ordering.DESCENDING; @@ -773,6 +775,12 @@ public void testShowCreateFunction() new ShowCreateFunction(QualifiedName.of("x", "y", "z"), Optional.of(ImmutableList.of("int", "double")))); } + @Test + public void testShowCreateSchema() + { + assertStatement("SHOW CREATE SCHEMA x.y", new ShowCreate(SCHEMA, QualifiedName.of("x", "y"))); + } + @Test public void testSubstringBuiltInFunction() { diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/connector/ConnectorMetadata.java b/presto-spi/src/main/java/com/facebook/presto/spi/connector/ConnectorMetadata.java index d31c12b68e23b..9c43abc637055 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/connector/ConnectorMetadata.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/connector/ConnectorMetadata.java @@ -13,6 +13,7 @@ */ package com.facebook.presto.spi.connector; +import com.facebook.presto.common.CatalogSchemaName; import com.facebook.presto.common.predicate.TupleDomain; import com.facebook.presto.common.type.Type; import com.facebook.presto.spi.ColumnHandle; @@ -81,6 +82,14 @@ default boolean schemaExists(ConnectorSession session, String schemaName) */ List listSchemaNames(ConnectorSession session); + /** + * Gets the schema properties for the specified schema. + */ + default Map getSchemaProperties(ConnectorSession session, CatalogSchemaName schemaName) + { + throw new PrestoException(NOT_SUPPORTED, "This connector does not support schema properties"); + } + /** * Returns a table handle for the specified table name, or null if the connector does not contain the table. */ diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/connector/classloader/ClassLoaderSafeConnectorMetadata.java b/presto-spi/src/main/java/com/facebook/presto/spi/connector/classloader/ClassLoaderSafeConnectorMetadata.java index fa1aeb780f691..30b87d75cb86a 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/connector/classloader/ClassLoaderSafeConnectorMetadata.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/connector/classloader/ClassLoaderSafeConnectorMetadata.java @@ -13,6 +13,7 @@ */ package com.facebook.presto.spi.connector.classloader; +import com.facebook.presto.common.CatalogSchemaName; import com.facebook.presto.common.predicate.TupleDomain; import com.facebook.presto.common.type.Type; import com.facebook.presto.spi.ColumnHandle; @@ -211,6 +212,14 @@ public List listSchemaNames(ConnectorSession session) } } + @Override + public Map getSchemaProperties(ConnectorSession session, CatalogSchemaName schemaName) + { + try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { + return delegate.getSchemaProperties(session, schemaName); + } + } + @Override public ConnectorTableHandle getTableHandle(ConnectorSession session, SchemaTableName tableName) {