{"record":{"id":"8a905e704fe08dc2","repo":"apache/druid","slug":"disallowed-column-names-s","errorCode":null,"errorMessage":"Disallowed column names[%s]","messagePattern":"Disallowed column names\\[(.+?)\\]","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/frame/read/FrameReader.java","lineNumber":86,"sourceCode":"\n  private FrameReader(final RowSignature signature)\n  {\n    this.signature = signature;\n  }\n\n  /**\n   * Create a reader for frames with a given {@link RowSignature}. The signature must exactly match the frames to be\n   * read, or else behavior is undefined.\n   *\n   * @param signature signature used to generate the reader\n   */\n  public static FrameReader create(final RowSignature signature)\n  {\n    // Double-check that the frame does not have any disallowed field names. Generally, we expect this to be\n    // caught on the write side, but we do it again here for safety.\n    final Set<String> disallowedFieldNames = FrameWriterUtils.findDisallowedFieldNames(signature);\n    if (!disallowedFieldNames.isEmpty()) {\n      throw new IAE(\"Disallowed column names[%s]\", disallowedFieldNames);\n    }\n\n    // Check that the signature does not have any null types.\n    for (int columnNumber = 0; columnNumber < signature.size(); columnNumber++) {\n      if (!signature.getColumnType(columnNumber).isPresent()) {\n        throw DruidException.defensive(\"Missing type for column[%s]\", signature.getColumnName(columnNumber));\n      }\n    }\n\n    return new FrameReader(signature);\n  }\n\n  public RowSignature signature()\n  {\n    return signature;\n  }\n\n  /**","sourceCodeStart":68,"sourceCodeEnd":104,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/frame/read/FrameReader.java#L68-L104","documentation":"FrameReader.create validates the RowSignature that will be used to interpret frames. Column names that are disallowed (e.g. containing characters or values that conflict with frame storage rules, as found by FrameWriterUtils.findDisallowedFieldNames) are rejected on read even though they should have been caught on write. IAE indicates the caller supplied an invalid signature.","triggerScenarios":"Calling FrameReader.create(RowSignature) with a signature containing a column name like an empty string, or one containing dots/other disallowed characters per FrameWriterUtils.findDisallowedFieldNames.","commonSituations":"Programmatically building RowSignature with raw column names from user input or external schemas; joining/ad-hoc queries producing synthetic columns with illegal names.","solutions":["Sanitize or rename offending columns in the RowSignature before creating the FrameReader","Validate with FrameWriterUtils.findDisallowedFieldNames(signature) before calling create and fix the listed names","Fix the upstream writer/ingestion spec that produced the bad column names"],"exampleFix":"// before\nFrameReader reader = FrameReader.create(signature); // signature has \"a.b\" column\n// after\nSet<String> bad = FrameWriterUtils.findDisallowedFieldNames(signature);\nif (!bad.isEmpty()) {\n  signature = renameColumns(signature, bad);\n}\nFrameReader reader = FrameReader.create(signature);","handlingStrategy":"validation","validationCode":"Set<String> bad = FrameWriterUtils.findDisallowedFieldNames(signature); if (!bad.isEmpty()) { throw new IllegalArgumentException(\"Bad column names: \" + bad); }","typeGuard":"null","tryCatchPattern":"try { FrameReader.create(signature); } catch (IllegalArgumentException e) { /* rename offending columns and retry */ }","preventionTips":["Validate column names against findDisallowedFieldNames early","Sanitize user/external schema names before building signatures","Add signature validation at ingestion time"],"tags":["validation","column-names","frame"],"backgroundTag":"schema-validation-failed","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}