{"record":{"id":"c7e6be7db65a3735","repo":"prestodb/presto","slug":"missing-schema-c7e6be","errorCode":"MISSING_SCHEMA","errorMessage":"Schema name is empty","messagePattern":"Schema name is empty","errorType":"error_code","errorClass":"SemanticException","httpStatus":null,"severity":"error","filePath":"presto-main-base/src/main/java/com/facebook/presto/sql/analyzer/MetadataExtractor.java","lineNumber":84,"sourceCode":"    public void populateMetadataHandle(Session session, Statement statement, MetadataHandle metadataHandle)\n    {\n        if (executor.isPresent() && isPreProcessMetadataCalls(session)) {\n            metadataHandle.setPreProcessMetadataCalls(true);\n            populateMetadataHandle(session, statement, metadataHandle, new MetadataExtractorContext());\n        }\n    }\n\n    private void populateMetadataHandle(Session session, Statement statement, MetadataHandle metadataHandle, MetadataExtractorContext metadataExtractorContext)\n    {\n        Visitor visitor = new Visitor(session);\n        visitor.process(statement, metadataExtractorContext);\n\n        metadataExtractorContext.getTableNames().forEach(tableName -> {\n            if (tableName.getObjectName().isEmpty()) {\n                throw new SemanticException(MISSING_TABLE, \"Table name is empty\");\n            }\n            if (tableName.getSchemaName().isEmpty()) {\n                throw new SemanticException(MISSING_SCHEMA, \"Schema name is empty\");\n            }\n\n            metadataHandle.addViewDefinition(tableName, executor.get().submit(() -> {\n                Optional<ViewDefinition> optionalView = session.getRuntimeStats().recordWallTime(\n                        GET_VIEW_TIME_NANOS,\n                        () -> metadataResolver.getView(tableName));\n                if (optionalView.isPresent()) {\n                    ViewDefinition view = optionalView.get();\n                    Statement viewStatement = sqlParser.createStatement(view.getOriginalSql(), createParsingOptions(session, warningCollector));\n                    Session.SessionBuilder viewSessionBuilder = Session.builder(metadata.getSessionPropertyManager())\n                            .setQueryId(session.getQueryId())\n                            .setRuntimeStats(session.getRuntimeStats())\n                            .setTransactionId(session.getTransactionId().orElse(null))\n                            .setIdentity(session.getIdentity())\n                            .setSource(session.getSource().orElse(null))\n                            .setCatalog(view.getCatalog().orElse(null))\n                            .setSchema(view.getSchema().orElse(null))\n                            .setTimeZoneKey(session.getTimeZoneKey())","sourceCodeStart":66,"sourceCodeEnd":102,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-main-base/src/main/java/com/facebook/presto/sql/analyzer/MetadataExtractor.java#L66-L102","documentation":"In the same populateMetadataHandle loop, after validating the object name, MetadataExtractor validates the schema part of each collected QualifiedObjectName. An empty schemaName triggers MISSING_SCHEMA because a catalog-local, schema-less name cannot be resolved to view definitions.","triggerScenarios":"A referenced table/view name resolves to a QualifiedObjectName with an empty schema component — e.g. a one-part name that the connector mapped to a catalog but no schema.","commonSituations":"Omitting the schema when one is required by the connector; generated SQL missing the schema segment; cross-catalog references where the schema was accidentally dropped.","solutions":["Fully qualify the table reference with its schema: catalog.schema.table.","Set a default schema for the session if the connector supports one, so unqualified names resolve correctly.","Fix the upstream generator/templating that drops the schema segment."],"exampleFix":"// before\nSELECT * FROM events;\n// after\nSELECT * FROM hive.default.events;","handlingStrategy":"validation","validationCode":"// require the schema segment before executing\nfunction assertQualified(name) {\n  const parts = name.split(\".\").filter(Boolean);\n  if (parts.length < 2) throw new Error(\"Reference must include schema: catalog.schema.table\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Set a session default schema (USE catalog.schema) when using unqualified names.","Standardize on fully-qualified names in ETL and BI tooling."],"tags":["metadata-extractor","missing-schema","empty-name","sql"],"backgroundTag":"empty-schema-name","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"}