{"record":{"id":"3efcadb6e4f50ff5","repo":"prestodb/presto","slug":"sheet-name-ambiguous","errorCode":"SHEET_NAME_AMBIGUOUS","errorMessage":"Ambiguous name %s in spreadsheet %s: matched sheets: %s","messagePattern":"Ambiguous name (.+?) in spreadsheet (.+?): matched sheets: (.+?)","errorType":"error_code","errorClass":"PrestoException","httpStatus":null,"severity":"error","filePath":"presto-lark-sheets/src/main/java/com/facebook/presto/lark/sheets/LarkSheetsMetadata.java","lineNumber":107,"sourceCode":"        return getVisibleSchema(session, schemaName).isPresent();\n    }\n\n    @Nullable\n    @Override\n    public ConnectorTableHandle getTableHandle(ConnectorSession session, SchemaTableName tableName)\n    {\n        String schemaName = tableName.getSchemaName();\n        LarkSheetsSchema schema = requireVisibleSchema(session, schemaName);\n        checkSchemaReadable(schema);\n        String token = schema.getToken();\n        String sheetName = tableName.getTableName();\n        SpreadsheetInfo spreadsheetInfo = api.getMetaInfo(token);\n        List<SheetInfo> matched = filterSheets(spreadsheetInfo.getSheets(), sheetName);\n        if (matched.isEmpty()) {\n            return null;\n        }\n        else if (matched.size() > 1) {\n            throw new PrestoException(LarkSheetsErrorCode.SHEET_NAME_AMBIGUOUS,\n                    format(\"Ambiguous name %s in spreadsheet %s: matched sheets: %s\", sheetName, mask(token), matched));\n        }\n        SheetInfo sheet = matched.get(0);\n        return toSheetsTableHandle(sheet);\n    }\n\n    @Override\n    public Optional<SystemTable> getSystemTable(ConnectorSession session, SchemaTableName tableName)\n    {\n        String schemaName = tableName.getSchemaName();\n        LarkSheetsSchema schema = requireVisibleSchema(session, schemaName);\n        checkSchemaReadable(schema);\n\n        if (LarkSheetsSystemTable.requestsSheets(tableName.getTableName())) {\n            SpreadsheetInfo metaInfo = api.getMetaInfo(schema.getToken());\n            return Optional.of(new LarkSheetsSystemTable(schema.getName(), metaInfo.getSheets()));\n        }\n","sourceCodeStart":89,"sourceCodeEnd":125,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-lark-sheets/src/main/java/com/facebook/presto/lark/sheets/LarkSheetsMetadata.java#L89-L125","documentation":"LarkSheetsMetadata.getTableHandle resolves a user-supplied sheet/table name against the sheets of a Lark spreadsheet identified by token. filterSheets does a name match; if more than one sheet matches, the connector refuses to guess and throws LarkSheetsErrorCode.SHEET_NAME_AMBIGUOUS with the list of matched sheets. The token is masked in the message for security.","triggerScenarios":"CallinggetTableHandle (i.e. querying a named table in the spreadsheet schema) where case-insensitive/filtered sheet-name matching returns 2+ SheetInfo entries, e.g. duplicate sheet names or names differing only in case in the same spreadsheet.","commonSituations":"A Lark spreadsheet has two sheets named 'Sales' and 'sales'; a rename left a stale duplicate sheet; the sheetName filter uses a substring/prefix that matches multiple sheets; collaborators copied a sheet without renaming it.","solutions":["Rename the duplicate sheets in the Lark spreadsheet so exactly one sheet matches the requested name.","Reference the sheet unambiguously in the query using the exact, unique sheet name.","Delete the redundant sheet copy that collides with the original.","Query the metadata (information_schema.tables) to list actual sheet names and pick the right one."],"exampleFix":"// before\nSELECT * FROM lark_sheets.\"docToken\".sales; -- matches 'Sales' and 'sales'\n// after: rename one sheet in Lark, then\nSELECT * FROM lark_sheets.\"docToken\".sales; -- now matches exactly one sheet","handlingStrategy":"validation","validationCode":"List<String> tables = execute(\"SHOW TABLES FROM lark_sheets.my_schema\").column(\"name\");\nString wanted = \"sales\";\nlong matches = tables.stream().filter(t -> t.equalsIgnoreCase(wanted)).count();\nif (matches != 1) { throw new IllegalStateException(\"sheet 'sales' matches \" + matches + \" sheets; rename duplicates in Lark\"); }","typeGuard":null,"tryCatchPattern":"try { return metadata.getTableHandle(session, tableName); } catch (PrestoException e) { if (e.getErrorCode().getCode() == LarkSheetsErrorCode.SHEET_NAME_AMBIGUOUS.toErrorCode().getCode()) { // pick exact-case name or ask user to rename sheets } else { throw e; } }","preventionTips":["Enforce unique, case-distinct sheet names in shared spreadsheets","Avoid copy/sheet-duplication without renaming","List tables (SHOW TABLES) before referencing by name","Use the exact name returned by metadata, not a prefix"],"tags":["presto-connector","lark-sheets","name-resolution","metadata"],"backgroundTag":"ambiguous-identifier","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"}