{"record":{"id":"1cb47640af2ef85f","repo":"apache/druid","slug":"orc-flattener-does-not-support-nested-root-queries","errorCode":null,"errorMessage":"ORC flattener does not support nested root queries","messagePattern":"ORC flattener does not support nested root queries","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"extensions-core/orc-extensions/src/main/java/org/apache/druid/data/input/orc/OrcStructFlattenerMaker.java","lineNumber":110,"sourceCode":"      return finalizeConversion(val);\n    };\n  }\n\n  @Nullable\n  @Override\n  public Function<OrcStruct, Object> makeJsonQueryExtractor(String expr)\n  {\n    throw new UnsupportedOperationException(\"ORC flattener does not support JQ\");\n  }\n\n  @Override\n  public Function<OrcStruct, Object> makeJsonTreeExtractor(List<String> nodes)\n  {\n    if (nodes.size() == 1) {\n      return (OrcStruct record) -> getRootField(record, nodes.get(0));\n    }\n\n    throw new UnsupportedOperationException(\"ORC flattener does not support nested root queries\");\n  }\n\n  @Override\n  public JsonProvider getJsonProvider()\n  {\n    return orcJsonProvider;\n  }\n\n  @Override\n  public Object finalizeConversionForMap(Object o)\n  {\n    return finalizeConversion(o);\n  }\n\n  private Object finalizeConversion(Object o)\n  {\n    // recursively convert any complex types\n    if (o instanceof OrcStruct || o instanceof OrcMap || o instanceof OrcList) {","sourceCodeStart":92,"sourceCodeEnd":128,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/extensions-core/orc-extensions/src/main/java/org/apache/druid/data/input/orc/OrcStructFlattenerMaker.java#L92-L128","documentation":"OrcStructFlattenerMaker.makeJsonTreeExtractor() only supports single-node (top-level) paths; multi-node paths would require nested JSON-tree traversal that ORC flattening does not implement, so it throws UnsupportedOperationException for nested root queries.","triggerScenarios":"Defining an ORC flattenSpec expression whose parsed node list has more than one node (e.g. a nested path like 'a.b' rather than a single root field).","commonSituations":"Attempting to flatten nested ORC struct fields with dot-separated expressions; migrating flatten configs from formats that support nested extraction (JSON) to ORC.","solutions":["Flatten only top-level ORC columns, or specify a single root field per flatten expression","Use ORC 'path' expressions limited to first-level fields, or restructure data so nested fields are top-level","Use a format with full nested support (e.g. Avro/JSON) if nested extraction is essential"],"exampleFix":"// before\n{\"name\":\"nested\",\"expr\":\"$.outer.inner\"}\n// after\n{\"name\":\"inner\",\"expr\":\"$.inner\"}  // or make inner a top-level column","handlingStrategy":"validation","validationCode":"final boolean nested = flattenSpec.getFields().stream().anyMatch(f -> f.getExpr() != null && f.getExpr().split(\"\\\\.\").length > 1);\nif (nested) { throw new IllegalArgumentException(\"ORC flatten supports only single-node (root) expressions\"); }","typeGuard":null,"tryCatchPattern":"try { extractor = flattenerMaker.makeJsonTreeExtractor(nodes); } catch (UnsupportedOperationException e) { extractor = flattenTopLevelOnly(nodes.get(0)); }","preventionTips":["Restrict ORC flattenSpec expressions to top-level columns","Promote needed nested fields to top-level during data production","Test flatten specs on a sample ORC file before production ingestion"],"tags":["orc","flatten-spec","nested-fields","unsupported-operation"],"backgroundTag":"unsupported-operation","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}