{"record":{"id":"e641e067134e9eda","repo":"prestodb/presto","slug":"sheet-bad-data","errorCode":"SHEET_BAD_DATA","errorMessage":"Sheet %s.%s is empty","messagePattern":"Sheet (.+?)\\.(.+?) is empty","errorType":"error_code","errorClass":"PrestoException","httpStatus":null,"severity":"error","filePath":"presto-lark-sheets/src/main/java/com/facebook/presto/lark/sheets/api/SimpleLarkSheetsApi.java","lineNumber":105,"sourceCode":"        }\n    }\n\n    @Override\n    public List<String> getHeaderRow(String token, String sheetId, int columnCount)\n    {\n        String lastColumnLabel = LarkSheetsUtil.columnIndexToColumnLabel(columnCount - 1);\n        String range = format(\"%s!A1:%s1\", sheetId, lastColumnLabel);\n        try {\n            SheetsService.SpreadsheetsValuesGetReqCall request = sheetsService.getSpreadsheetss().valuesGet();\n            request.setSpreadsheetToken(token);\n            request.setRange(range);\n\n            Response<SpreadsheetsValuesGetResult> response = request.execute();\n            checkResponse(response);\n            SpreadsheetsValuesGetResult data = response.getData();\n            Object[] values = data.getValueRange().getValues();\n            if (values.length == 0) {\n                throw new PrestoException(LarkSheetsErrorCode.SHEET_BAD_DATA,\n                        format(\"Sheet %s.%s is empty\", mask(token), sheetId));\n            }\n            if (!(values[0] instanceof List)) {\n                throw new PrestoException(LARK_API_ERROR,\n                        format(\"Illegal response data of sheet %s @ %s\", mask(token), range));\n            }\n            List<?> header = ((List<?>) values[0]);\n            return header.stream().map(obj -> obj == null ? null : obj.toString()).collect(Collectors.toList());\n        }\n        catch (Exception e) {\n            throw wrapApiError(e, format(\"Could not get data of sheet %s @ %s\", mask(token), range));\n        }\n    }\n\n    @Override\n    public SheetValues getValues(String token, String range)\n    {\n        try {","sourceCodeStart":87,"sourceCodeEnd":123,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-lark-sheets/src/main/java/com/facebook/presto/lark/sheets/api/SimpleLarkSheetsApi.java#L87-L123","documentation":"SimpleLarkSheetsApi.getHeaderRow reads the first row of a sheet via the Lark Sheets value-range API and throws SHEET_BAD_DATA when the returned values array is empty — i.e. the sheet has no rows at all. The connector requires at least a header row to derive column names.","triggerScenarios":"Querying a lark-sheets table whose underlying spreadsheet range is completely empty (no header row, values array length 0 returned from getValueRange().getValues()).","commonSituations":"Pointing a table definition at a brand-new/blank sheet; wrong sheetId or range so the API returns an empty range; someone cleared all rows of the sheet.","solutions":["Add a header row (and at least one data row) to the sheet, then retry.","Verify the sheetId and range in the table/metadata definition point at the intended populated region.","Catch PrestoException with code SHEET_BAD_DATA and surface a clearer message asking the user to populate the sheet."],"exampleFix":"// before\nPrestoException e = /* SHEET_BAD_DATA: Sheet <token>.<sheetId> is empty */;\n\n// after — validate externally before querying\nif (sheetIsEmpty(spreadsheet, sheetId)) {\n    throw new UserGuideException(\"Populate sheet with a header row first\");\n}","handlingStrategy":"validation","validationCode":"// before querying, verify the range has data via a metadata/preview call\nboolean empty = api.getValues(token, sheetId, range) == null; // or check returned rows.isEmpty()\nif (empty) throw new IllegalStateException(\"Sheet must contain a header row before querying\");","typeGuard":"boolean isNonEmptySheet(SheetValues v) { return v != null && v.getRows() != null && !v.getRows().isEmpty(); }","tryCatchPattern":"try { header = api.getHeaderRow(token, sheetId, range); } catch (PrestoException e) { if (isErrorCode(e, LarkSheetsErrorCode.SHEET_BAD_DATA)) { promptUserToAddHeaderRow(); } else { throw e; } }","preventionTips":["Ensure every mapped sheet has a header row before creating tables on it.","Double-check sheetId and range values in table metadata.","Add a preflight readability check (isReadable) before registering the table."],"tags":["bad-data","empty-sheet","presto"],"backgroundTag":"empty-dataset","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"}