{"record":{"id":"c751c746700b3db9","repo":"prestodb/presto","slug":"illegal-char-c-in-label","errorCode":null,"errorMessage":"Illegal char '%c' in label","messagePattern":"Illegal char '%c' in label","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"presto-lark-sheets/src/main/java/com/facebook/presto/lark/sheets/LarkSheetsUtil.java","lineNumber":153,"sourceCode":"        }\n        return String.join(\"\", chars);\n    }\n\n    private static String[] buildAlphabetTable()\n    {\n        String[] table = new String[RADIX];\n        for (int i = 0; i < RADIX; i++) {\n            table[i] = Character.toString((char) ('A' + i));\n        }\n        return table;\n    }\n\n    private static int charToIndex(char c)\n    {\n        if (c >= 'A' && c <= 'Z') {\n            return c - 'A';\n        }\n        throw new IllegalArgumentException(format(\"Illegal char '%c' in label\", c));\n    }\n}\n","sourceCodeStart":135,"sourceCodeEnd":156,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-lark-sheets/src/main/java/com/facebook/presto/lark/sheets/LarkSheetsUtil.java#L135-L156","documentation":"LarkSheetsUtil.charToIndex converts a single character of a spreadsheet column label (A-Z, like Excel) into a 0-based index; any character outside 'A'-'Z' is rejected with IllegalArgumentException(\"Illegal char '%c' in label\"). It is used by columnLabelToColumnIndex when parsing column labels.","triggerScenarios":"Calling columnLabelToColumnIndex with a label containing lowercase letters, digits, whitespace, or any non-A-Z character (e.g. 'a1', 'AA ', 'ab').","commonSituations":"Config passed a lowercase column label ('a' instead of 'A'); label contains a column number instead of a letter; stray whitespace or BOM characters in config files; off-by-one pasting from other tooling that uses 1-based numeric columns.","solutions":["Uppercase and trim the label before passing it (e.g. 'a' -> 'A').","Use only the letters A-Z in the label; convert numeric column positions yourself if you have numbers.","Strip whitespace/control characters from configuration values.","If you maintain the connector, normalize with toUpperCase(Locale.ROOT).trim() inside columnLabelToColumnIndex."],"exampleFix":"// before\nint idx = LarkSheetsUtil.columnLabelToColumnIndex(\"a\");\n// after\nint idx = LarkSheetsUtil.columnLabelToColumnIndex(\"a\".trim().toUpperCase(Locale.ROOT));","handlingStrategy":"validation","validationCode":"public static int safeColumnLabelToIndex(String label) {\n    String norm = label.trim().toUpperCase(Locale.ROOT);\n    if (!norm.matches(\"[A-Z]+\")) throw new IllegalArgumentException(\"Label must be A-Z only: \" + label);\n    return LarkSheetsUtil.columnLabelToColumnIndex(norm);\n}","typeGuard":null,"tryCatchPattern":"try { int i = LarkSheetsUtil.columnLabelToColumnIndex(raw); } catch (IllegalArgumentException e) { if (e.getMessage().contains(\"Illegal char\")) { // normalize to uppercase A-Z and retry } else { throw e; } }","preventionTips":["Always uppercase and trim labels from user/config input","Accept only A-Z letters, never numeric column indexes","Strip BOM/control characters when reading config files","Add a unit test covering lowercase and whitespace inputs"],"tags":["lark-sheets","parsing","input-validation"],"backgroundTag":"invalid-input-format","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"}