prestodb/presto · error · SemanticException
MISSING_SCHEMA
MISSING_SCHEMA
Error message
Schema '%s' does not exist
What it means
CreateViewTask.execute, after confirming the catalog exists, checks metadataResolver.schemaExists for the target catalog.schema. If the schema does not exist, it throws SemanticException(MISSING_SCHEMA). Presto does not auto-create schemas on CREATE VIEW.
Source
Thrown at presto-main-base/src/main/java/com/facebook/presto/execution/CreateViewTask.java:101
@Override
public String explain(CreateView statement, List<Expression> parameters)
{
return "CREATE VIEW " + statement.getName();
}
@Override
public ListenableFuture<?> execute(CreateView statement, TransactionManager transactionManager, Metadata metadata, AccessControl accessControl, Session session, List<Expression> parameters, WarningCollector warningCollector, String query)
{
QualifiedObjectName name = createQualifiedObjectName(session, statement, statement.getName(), metadata);
MetadataResolver metadataResolver = metadata.getMetadataResolver(session);
if (!metadataResolver.catalogExists(name.getCatalogName())) {
throw new SemanticException(MISSING_CATALOG, "Catalog '%s' does not exist", name.getCatalogName());
}
if (!metadataResolver.schemaExists(name.getCatalogSchemaName())) {
throw new SemanticException(MISSING_SCHEMA, statement, "Schema '%s' does not exist", name.getSchemaName());
}
accessControl.checkCanCreateView(session.getRequiredTransactionId(), session.getIdentity(), session.getAccessControlContext(), name);
String sql = getFormattedSql(statement.getQuery(), sqlParser, Optional.of(parameters));
Analysis analysis = analyzeStatement(statement, session, metadata, accessControl, parameters, warningCollector, query);
List<ViewColumn> columns = analysis.getOutputDescriptor(statement.getQuery())
.getVisibleFields().stream()
.map(field -> new ViewColumn(field.getName().get(), field.getType()))
.collect(toImmutableList());
List<ColumnMetadata> columnMetadata = columns.stream()
.map(column -> ColumnMetadata.builder()
.setName(metadata.normalizeIdentifier(session, name.getCatalogName(), column.getName()))
.setType(column.getType())
.build())View on GitHub (pinned to 55bb57d202)
Solutions
- Run CREATE SCHEMA <catalog>.<schema> first, then retry CREATE VIEW.
- Verify with SHOW SCHEMAS FROM <catalog> and correct the schema name if it was misspelled.
- If using a session-level default schema, explicitly qualify the view name with an existing schema.
Example fix
// before CREATE VIEW hive.analytics.daily AS SELECT ...; -- schema missing // after CREATE SCHEMA IF NOT EXISTS hive.analytics; CREATE VIEW hive.analytics.daily AS SELECT ...;
Defensive patterns
Strategy: validation
Validate before calling
-- Ensure schema exists before CREATE VIEW CREATE SCHEMA IF NOT EXISTS hive.analytics; -- or check SELECT schema_name FROM information_schema.schemata WHERE catalog_name = 'hive' AND schema_name = 'analytics';
Type guard
function schemaExists(session, cat, schema) {
return session.execute('SELECT count(*) FROM information_schema.schemata WHERE catalog_name = ? AND schema_name = ?', [cat, schema]) > 0;
} Try / catch
try {
session.execute(createViewSql);
} catch (e) {
if (/Schema '.*' does not exist/.test(e.message)) {
session.execute(`CREATE SCHEMA IF NOT EXISTS ${qualifiedSchema}`);
return session.execute(createViewSql);
}
throw e;
} Prevention
- Prefix environment bootstrap with CREATE SCHEMA IF NOT EXISTS for all needed schemas.
- Always fully qualify view names (catalog.schema.view); avoid relying on default schemas.
- Run SHOW SCHEMAS FROM <catalog> when moving SQL between environments.
When it happens
Trigger: Executing CREATE VIEW <catalog>.<schema>.<name> where the catalog exists but <schema> was never created (no prior CREATE SCHEMA).
Common situations: New deployment or new environment where schemas were not bootstrapped; typo in schema name; relying on a default schema that does not exist in this catalog; schema dropped by another job.
Related errors
AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04).
Data as JSON: /api/errors/9aee0501e5f214fd.
Report an issue: GitHub.