{"record":{"id":"89d92e3dcdc55c60","repo":"apache/beam","slug":"unknown-window-function-simplename","errorCode":null,"errorMessage":"Unknown window function ${simpleName}","messagePattern":"Unknown window function (.+?)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"warning","filePath":"sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/rel/BeamAggregationRel.java","lineNumber":177,"sourceCode":"      String window = windowFn.getClass().getSimpleName() + \"($\" + String.valueOf(windowFieldIndex);\n      if (windowFn instanceof FixedWindows) {\n        FixedWindows fn = (FixedWindows) windowFn;\n        window = window + \", \" + fn.getSize().toString() + \", \" + fn.getOffset().toString();\n      } else if (windowFn instanceof SlidingWindows) {\n        SlidingWindows fn = (SlidingWindows) windowFn;\n        window =\n            window\n                + \", \"\n                + fn.getPeriod().toString()\n                + \", \"\n                + fn.getSize().toString()\n                + \", \"\n                + fn.getOffset().toString();\n      } else if (windowFn instanceof Sessions) {\n        Sessions fn = (Sessions) windowFn;\n        window = window + \", \" + fn.getGapDuration().toString();\n      } else {\n        throw new UnsupportedOperationException(\n            \"Unknown window function \" + windowFn.getClass().getSimpleName());\n      }\n      window = window + \")\";\n      pw.item(\"window\", window);\n    }\n    return pw;\n  }\n\n  @Override\n  public PTransform<PCollectionList<Row>, PCollection<Row>> buildPTransform() {\n    Schema outputSchema = CalciteUtils.toSchema(getRowType());\n    List<FieldAggregation> aggregationAdapters =\n        getNamedAggCalls().stream()\n            .map(aggCall -> new FieldAggregation(aggCall.getKey(), aggCall.getValue()))\n            .collect(toList());\n\n    return new Transform(\n        windowFn, windowFieldIndex, getGroupSet(), aggregationAdapters, outputSchema);","sourceCodeStart":159,"sourceCodeEnd":195,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/rel/BeamAggregationRel.java#L159-L195","documentation":"When explaining a BeamAggregationRel plan, the explain string includes window-function parameters. Only FixedWindows, SlidingWindows and Sessions are recognized; any other WindowFn (e.g. CalendarWindows or a custom one) is unknown to this code and throws UnsupportedOperationException during EXPLAIN/plan rendering.","triggerScenarios":"Running EXPLAIN (or any plan-explanation path) on a Beam SQL aggregation whose upstream PCollection uses a WindowFn other than fixed/sliding/session windows.","commonSituations":"Applying a custom WindowFn in Java and then querying that PCollection with Beam SQL; using CalendarWindows which Beam SQL's explain path does not know about.","solutions":["Use TUMBLE/HOP/SESSION windowing in the SQL query so the rel uses a supported WindowFn","Convert the input PCollection to a supported windowing (fixed/sliding/session) before the SQL aggregation","Catch UnsupportedOperationException around explain/plan-printing if you must explain pipelines with custom windows","Extend BeamAggregationRel.explainTerms to describe your WindowFn if forking"],"exampleFix":"// before\nSELECT COUNT(*) FROM t -- input uses CalendarWindows\n// after\nSELECT COUNT(*) FROM t GROUP BY TUMBLE(ts, INTERVAL '1' DAY)","handlingStrategy":"try-catch","validationCode":"import org.apache.beam.sdk.transforms.windowing.*;\nWindowFn<?, ?> fn = upstream.getWindowingStrategy().getWindowFn();\nboolean explainable = fn instanceof FixedWindows || fn instanceof SlidingWindows || fn instanceof Sessions;","typeGuard":"boolean hasExplainableWindowFn(PCollection<?> pc) {\n  WindowFn<?, ?> fn = pc.getWindowingStrategy().getWindowFn();\n  return fn instanceof FixedWindows || fn instanceof SlidingWindows || fn instanceof Sessions;\n}","tryCatchPattern":"try {\n  printPlan(rel);\n} catch (UnsupportedOperationException e) {\n  if (e.getMessage().startsWith(\"Unknown window function\")) {\n    // explain with a generic fallback or re-window upstream\n  } else throw e;\n}","preventionTips":["Use TUMBLE/HOP/SESSION (fixed/sliding/session) windowing when Beam SQL will explain aggregations","Convert custom WindowFns (e.g. CalendarWindows) to supported ones before SQL aggregations","Guard EXPLAIN calls behind a windowing check"],"tags":["sql","windowing","explain","beam"],"backgroundTag":"unsupported-operation","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}