{"record":{"id":"ace4b8ceb4170f4c","repo":"prestodb/presto","slug":"schema-already-exists-ace4b8","errorCode":"SCHEMA_ALREADY_EXISTS","errorMessage":"Schema '%s' already exists","messagePattern":"Schema '(.+?)' already exists","errorType":"error_code","errorClass":"SemanticException","httpStatus":null,"severity":"error","filePath":"presto-main-base/src/main/java/com/facebook/presto/execution/CreateSchemaTask.java","lineNumber":66,"sourceCode":"    @Override\n    public String explain(CreateSchema statement, List<Expression> parameters)\n    {\n        return \"CREATE SCHEMA \" + statement.getSchemaName();\n    }\n\n    @Override\n    public ListenableFuture<?> execute(CreateSchema statement, TransactionManager transactionManager, Metadata metadata, AccessControl accessControl, Session session, List<Expression> parameters, WarningCollector warningCollector, String query)\n    {\n        CatalogSchemaName schema = createCatalogSchemaName(session, statement, Optional.of(statement.getSchemaName()), metadata);\n\n        // Make sure catalog exists before access control checks\n        ConnectorId connectorId = getConnectorIdOrThrow(session, metadata, schema.getCatalogName());\n\n        accessControl.checkCanCreateSchema(session.getRequiredTransactionId(), session.getIdentity(), session.getAccessControlContext(), schema);\n\n        if (metadata.getMetadataResolver(session).schemaExists(schema)) {\n            if (!statement.isNotExists()) {\n                throw new SemanticException(SCHEMA_ALREADY_EXISTS, statement, \"Schema '%s' already exists\", schema);\n            }\n            return immediateFuture(null);\n        }\n\n        Map<String, Object> properties = metadata.getSchemaPropertyManager().getProperties(\n                connectorId,\n                schema.getCatalogName(),\n                mapFromProperties(statement.getProperties()),\n                session,\n                metadata,\n                parameterExtractor(statement, parameters));\n\n        metadata.createSchema(session, schema, properties);\n\n        return immediateFuture(null);\n    }\n}\n","sourceCodeStart":48,"sourceCodeEnd":84,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-main-base/src/main/java/com/facebook/presto/execution/CreateSchemaTask.java#L48-L84","documentation":"CreateSchemaTask.execute throws SemanticException(SCHEMA_ALREADY_EXISTS) when metadata resolver's schemaExists reports the target schema present and the statement lacks IF NOT EXISTS (statement.isNotExists() is false). Presto treats schema creation as fail-fast on duplicates unless the caller opted into tolerant behavior.","triggerScenarios":"CREATE SCHEMA cat.schema_name where the schema already exists and neither 'IF NOT EXISTS' was specified; also hit by idempotent bootstrap scripts re-running the same DDL.","commonSituations":"Repeated deployment of bootstrap SQL; concurrent jobs both creating the same schema; case-normalization surprises where an identically-named schema exists after identifier normalization.","solutions":["Add IF NOT EXISTS: CREATE SCHEMA IF NOT EXISTS cat.schema_name;","Check existence before creating (schemaExists / SHOW SCHEMAS FROM cat).","Make migration/bootstrap scripts tolerate SCHEMA_ALREADY_EXISTS as success.","Use a unique schema name if a genuinely different schema is intended."],"exampleFix":"-- before\nCREATE SCHEMA hive.analytics; -- fails on rerun\n\n-- after\nCREATE SCHEMA IF NOT EXISTS hive.analytics;","handlingStrategy":"try-catch","validationCode":"if (metadata.getMetadataResolver(session).schemaExists(schema) && !statement.isNotExists()) {\n    // skip creation or add IF NOT EXISTS to the statement\n    return;\n}","typeGuard":"boolean schemaMissing(Session session, Metadata metadata, QualifiedObjectName schema) {\n    return !metadata.getMetadataResolver(session).schemaExists(schema);\n}","tryCatchPattern":"try {\n    createSchema(session, statement, parameters);\n} catch (SemanticException e) {\n    if (e.getCode() == SCHEMA_ALREADY_EXISTS) {\n        // idempotent bootstrap: treat as success\n    } else {\n        throw e;\n    }\n}","preventionTips":["Always use CREATE SCHEMA IF NOT EXISTS in bootstrap/migration scripts","Check schemaExists before creating in shared environments","Treat SCHEMA_ALREADY_EXISTS as success in idempotent deployment tooling","Watch for identifier normalization causing name collisions"],"tags":["presto","schema","duplicate","ddl","idempotency"],"backgroundTag":"schema-already-exists","analyzedSha":"55bb57d202de3b926896fa966c2c4a44c779634e","analyzedAt":"2026-09-04T12:50:26.162Z","contentChangedAt":"2026-09-04T12:50:26.162Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}