prestodb/presto · error · SemanticException

MISSING_TABLE

MISSING_TABLE

Error message

Table '%s' does not exist

What it means

ALTER TABLE ... SET DEFAULT (SetColumnDefault) resolves the target table to a TableHandle first. If the table cannot be found and the statement was not issued with IF EXISTS semantics, Presto throws MISSING_TABLE and the ALTER is skipped.

Source

Thrown at presto-main-base/src/main/java/com/facebook/presto/execution/SetColumnDefaultTask.java:60

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

public class SetColumnDefaultTask
        implements DDLDefinitionTask<SetColumnDefault>
{
    @Override
    public String getName()
    {
        return "SET COLUMN DEFAULT";
    }

    @Override
    public ListenableFuture<?> execute(SetColumnDefault statement, TransactionManager transactionManager, Metadata metadata, AccessControl accessControl, Session session, List<Expression> parameters, WarningCollector warningCollector, String query)
    {
        QualifiedObjectName tableName = createQualifiedObjectName(session, statement, statement.getTable(), metadata);
        Optional<TableHandle> tableHandleOptional = metadata.getMetadataResolver(session).getTableHandle(tableName);
        if (!tableHandleOptional.isPresent()) {
            if (!statement.isTableExists()) {
                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.isTableExists()) {
                throw new SemanticException(NOT_SUPPORTED, statement, "'%s' is a materialized view, and set column default is not supported", tableName);
            }
            return immediateFuture(null);
        }

        TableHandle tableHandle = tableHandleOptional.get();
        String columnName = metadata.normalizeIdentifier(session, tableName.getCatalogName(), statement.getColumn().getValue());

        accessControl.checkCanAlterColumn(session.getRequiredTransactionId(), session.getIdentity(), session.getAccessControlContext(), tableName);

        Map<String, ColumnHandle> columnHandles = metadata.getColumnHandles(session, tableHandle);

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Verify the fully qualified table name exists before running the ALTER
  2. Add IF EXISTS semantics if a silent skip is acceptable
  3. Fix the catalog/schema context of the session

Example fix

// before
ALTER TABLE hive.default.orers ALTER COLUMN id SET DEFAULT 0;
// after
ALTER TABLE hive.default.orders ALTER COLUMN id SET DEFAULT 0;
Defensive patterns

Strategy: validation

Validate before calling

QualifiedObjectName name = createQualifiedObjectName(session, stmt, table, metadata);
if (metadata.getMetadataResolver(session).getTableHandle(name).isEmpty()) {
    throw new IllegalArgumentException("Table not found: " + name);
}

Try / catch

try {
    return task.execute(stmt, ...);
} catch (SemanticException e) {
    if (e.getCode() == SemanticErrorCode.MISSING_TABLE) {
        // skip or report missing table
    } else {
        throw e;
    }
}

Prevention

When it happens

Trigger: ALTER TABLE <name> ... SET DEFAULT on a name that createQualifiedObjectName resolves but the metadata resolver has no TableHandle for, and statement.isTableExists() (IF EXISTS not given) is false.

Common situations: Typo in qualified table name; table dropped concurrently; running the ALTER in the wrong catalog/schema; connector lag after table creation.

Related errors


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