apache/beam · error · RuntimeException

Encountered an unexpected node type: ${node.getClass().getSi

Error message

Encountered an unexpected node type: ${node.getClass().getSimpleName()}

What it means

MongoDbFilter.isSupported recognizes only RexCall nodes it can translate and bare RexInputRef nodes (boolean fields). Any other RexNode subclass reaching the else branch triggers this RuntimeException with the node's simple class name, signaling the filter-support checker encountered an unhandled node type.

Source

Thrown at sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/mongodb/MongoDbTable.java:492

          // Ex: `field1 == field2` is not supported.
          // TODO: Can be supported via Filters#where.
          if (fields == 1) {
            return true;
          }
        } else if (node.getKind().equals(AND) || node.getKind().equals(OR)) {
          // Nested ANDs and ORs are supported as long as all operands are supported.
          for (RexNode operand : compositeNode.getOperands()) {
            if (!isSupported(operand)) {
              return false;
            }
          }
          return true;
        }
      } else if (node instanceof RexInputRef) {
        // When field is a boolean.
        return true;
      } else {
        throw new RuntimeException(
            "Encountered an unexpected node type: " + node.getClass().getSimpleName());
      }

      return false;
    }
  }
}

View on GitHub (pinned to 12126d8942)

Solutions

  1. Restrict pushed predicates to comparison RexCalls and boolean RexInputRefs.
  2. Pre-filter the CNF list, skipping nodes that are not RexCall or RexInputRef so they are computed post-scan.
  3. Extend isSupported in the provider if the node type should be pushable.

Example fix

// before
filterCreate(cnf) // cnf contains a RexLiteral
// after
cnf.removeIf(n -> !(n instanceof RexCall || n instanceof RexInputRef));
filterCreate(cnf)
Defensive patterns

Strategy: type-guard

Validate before calling

if (!(node instanceof RexCall) && !(node instanceof RexInputRef)) {
  throw new IllegalArgumentException("Unsupported node in CNF: " + node.getClass());
}

Type guard

boolean isSupportedNode(RexNode n) { return n instanceof RexCall || n instanceof RexInputRef; }

Try / catch

try { support = MongoDbFilter.isSupported(node); } catch (RuntimeException e) { support = false; }

Prevention

When it happens

Trigger: Evaluating predicate support for a CNF list containing RexLiteral, RexFieldAccess, RexCorrelVariable, or other non-call/non-input-ref nodes — e.g. during create() when deciding which predicates are pushable to MongoDB.

Common situations: Optimizer-rewritten plans injecting literals or field accesses; programmatic predicate construction bypassing normal SQL parsing.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of apache/beam@12126d8942 (2026-09-13). Data as JSON: /api/errors/9e7e1283e867b8a8. Report an issue: GitHub.