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
- Verify the fully qualified table name exists before running the ALTER
- Add IF EXISTS semantics if a silent skip is acceptable
- 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
- Verify the table with SHOW TABLES/DESCRIBE before ALTER DDL
- Use IF EXISTS when the ALTER should tolerate absence
- Keep migration scripts aligned with the actual environment's catalog/schema
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.