prestodb/presto · error · SemanticException

MISSING_TABLE

MISSING_TABLE

Error message

Table '%s' does not exist

What it means

SemanticException (MISSING_TABLE) raised while resolving the source name of an ALTER TABLE ... RENAME statement: the metadata resolver found no table handle for the fully qualified source name. Note that with IF EXISTS the statement silently succeeds instead.

Source

Thrown at presto-main-base/src/main/java/com/facebook/presto/execution/RenameTableTask.java:56

import static com.google.common.util.concurrent.Futures.immediateFuture;

public class RenameTableTask
        implements DDLDefinitionTask<RenameTable>
{
    @Override
    public String getName()
    {
        return "RENAME TABLE";
    }

    @Override
    public ListenableFuture<?> execute(RenameTable statement, TransactionManager transactionManager, Metadata metadata, AccessControl accessControl, Session session, List<Expression> parameters, WarningCollector warningCollector, String query)
    {
        QualifiedObjectName tableName = createQualifiedObjectName(session, statement, statement.getSource(), metadata);
        Optional<TableHandle> tableHandle = metadata.getMetadataResolver(session).getTableHandle(tableName);
        if (!tableHandle.isPresent()) {
            if (!statement.isExists()) {
                throw new SemanticException(MISSING_TABLE, statement, "Table '%s' does not exist", tableName);
            }
            return immediateFuture(null);
        }

        Optional<MaterializedViewDefinition> optionalMaterializedView = metadata.getMetadataResolver(session).getMaterializedView(tableName);
        if (optionalMaterializedView.isPresent()) {
            if (!statement.isExists()) {
                throw new SemanticException(NOT_SUPPORTED, statement, "'%s' is a materialized view, and rename is not supported", tableName);
            }
            return immediateFuture(null);
        }

        QualifiedObjectName target = createQualifiedObjectName(session, statement, statement.getTarget(), metadata);
        getConnectorIdOrThrow(session, metadata, target.getCatalogName(), statement, targetTableCatalogError);
        if (metadata.getMetadataResolver(session).getTableHandle(target).isPresent()) {
            throw new SemanticException(TABLE_ALREADY_EXISTS, statement, "Target table '%s' already exists", target);
        }
        if (!tableName.getCatalogName().equals(target.getCatalogName())) {

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Verify spelling and qualification (catalog.schema.table) of the source table with SHOW TABLES
  2. Append IF EXISTS to the RENAME statement if the no-op behavior is acceptable
  3. Create the table first if it was expected to exist
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at presto-main-base/src/main/java/com/facebook/presto/execution/RenameTableTask.java:56 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04). Data as JSON: /api/errors/da4ae9ea4560d504. Report an issue: GitHub.