{"record":{"id":"fcdbab9f566eaf77","repo":"prestodb/presto","slug":"file-has-no-columns","errorCode":null,"errorMessage":"File has no columns","messagePattern":"File has no columns","errorType":"exception","errorClass":"OrcCorruptionException","httpStatus":null,"severity":"critical","filePath":"presto-orc/src/main/java/com/facebook/presto/orc/OrcReader.java","lineNumber":228,"sourceCode":"\n        this.bufferSize = orcFileTail.getBufferSize();\n        this.compressionKind = orcFileTail.getCompressionKind();\n        this.decompressor = createOrcDecompressor(orcDataSource.getId(), compressionKind, bufferSize, orcReaderOptions.isOrcZstdJniDecompressionEnabled());\n        this.hiveWriterVersion = orcFileTail.getHiveWriterVersion();\n\n        try (InputStream footerInputStream = new OrcInputStream(\n                orcDataSource.getId(),\n                // Memory is not accounted as the buffer is expected to be tiny and will be immediately discarded\n                new SharedBuffer(NOOP_ORC_LOCAL_MEMORY_CONTEXT),\n                orcFileTail.getFooterSlice().getInput(),\n                decompressor,\n                Optional.empty(),\n                aggregatedMemoryContext,\n                orcFileTail.getFooterSize())) {\n            this.footer = metadataReader.readFooter(hiveWriterVersion, footerInputStream, dwrfEncryptionProvider, dwrfKeyProvider, orcDataSource, decompressor);\n        }\n        if (this.footer.getTypes().isEmpty()) {\n            throw new OrcCorruptionException(orcDataSource.getId(), \"File has no columns\");\n        }\n\n        fileIntrospector.ifPresent(introspector -> introspector.onFileFooter(footer));\n\n        Optional<DwrfEncryption> encryption = footer.getEncryption();\n        if (encryption.isPresent()) {\n            requireNonNull(dwrfEncryptionProvider, \"dwrfEncryptionProvider is null\");\n            requireNonNull(dwrfKeyProvider, \"dwrfKeyProvider is null\");\n            validateEncryption(footer, this.orcDataSource.getId());\n            this.dwrfEncryptionGroupMap = createNodeToGroupMap(\n                    encryption.get().getEncryptionGroups().stream()\n                            .map(EncryptionGroup::getNodes)\n                            .collect(toImmutableList()),\n                    footer.getTypes());\n            this.encryptionLibrary = Optional.of(dwrfEncryptionProvider.getEncryptionLibrary(encryption.get().getKeyProvider()));\n            this.columnsToIntermediateKeys = ImmutableMap.copyOf(dwrfKeyProvider.getIntermediateKeys(footer.getTypes()));\n        }\n        else {","sourceCodeStart":210,"sourceCodeEnd":246,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-orc/src/main/java/com/facebook/presto/orc/OrcReader.java#L210-L246","documentation":"ORC reader error: the file's footer declares zero columns, so no data could be read. This guard fires while parsing the ORC file tail/footer — an ORC file must describe at least one column — and typically indicates a truncated, empty, or non-ORC file being read as ORC.","triggerScenarios":"OrcReader construction on a file whose footer.getTypes() is empty — e.g. a zero-byte or truncated footer, or a file written without any columns.","commonSituations":"Corrupted or truncated downloads, empty files mislabeled as .orc, writer bugs that emitted empty schemas, incompatible DWRF variants.","solutions":["Verify the file is a valid non-empty ORC file (check magic bytes and footer size)","Re-generate or re-copy the file from the source","Check for truncation in transfer/storage and compare checksums","Upgrade the writer library if it produced empty-schema files"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"long size = fs.getContentSummary(path).getLength();\nbyte[] head = readFirstBytes(path, 4);\nif (size < 100 || !Arrays.equals(head, new byte[]{'O','R','C'})) {\n    throw new InvalidInputException(\"Not a valid ORC file: \" + path);\n}","typeGuard":"boolean looksLikeOrc(byte[] magic) {\n    return magic != null && magic.length >= 3 && magic[0]=='O' && magic[1]=='R' && magic[2]=='C';\n}","tryCatchPattern":"try (OrcReader r = new OrcReader(...)) { ... }\ncatch (OrcCorruptionException e) {\n    if (e.getMessage().contains(\"File has no columns\")) { /* quarantine file, fail job */ }\n}","preventionTips":["Validate file size and magic bytes before opening","Verify checksums after transfer","Avoid writing ORC with empty column schemas"],"tags":["orc","corruption","footer","schema"],"backgroundTag":"orc-file-corruption","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"}