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

  1. Run CREATE SCHEMA <catalog>.<schema> first, then retry CREATE VIEW.
  2. Verify with SHOW SCHEMAS FROM <catalog> and correct the schema name if it was misspelled.
  3. 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

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.