prestodb/presto · error · IllegalArgumentException

expecting SpecialFormExpression(DEREFERENCE), but got:

Error message

expecting SpecialFormExpression(DEREFERENCE), but got: 

What it means

Internal shape check in createNestedColumn: the optimizer handed this pass an expression it expected to be a SpecialFormExpression of DEREFERENCE but is not — a planner invariant violation, not a user data problem. Indicates a change in expression shape upstream or a bug in the pushdown rule.

Source

Thrown at presto-parquet/src/main/java/com/facebook/presto/parquet/rule/ParquetDereferencePushDown.java:162

                    {
                        if (allExpressions.contains(reference)) {
                            referenceCount[0] += 1;
                        }
                        return null;
                    }
                }, referenceCount);

        return referenceCount[0] > 1;
    }

    private Subfield createNestedColumn(
            Map<String, ColumnHandle> baseColumnHandles,
            RowExpression rowExpression,
            ExpressionOptimizer expressionOptimizer,
            ConnectorSession session)
    {
        if (!(rowExpression instanceof SpecialFormExpression) || ((SpecialFormExpression) rowExpression).getForm() != DEREFERENCE) {
            throw new IllegalArgumentException("expecting SpecialFormExpression(DEREFERENCE), but got: " + rowExpression);
        }

        RowExpression currentRowExpression = rowExpression;
        List<Subfield.PathElement> elements = new ArrayList<>();
        while (true) {
            if (currentRowExpression instanceof VariableReferenceExpression) {
                Collections.reverse(elements);
                String name = ((VariableReferenceExpression) currentRowExpression).getName();
                ColumnHandle handle = baseColumnHandles.get(name);
                checkArgument(handle != null, "Missing Column handle: " + name);
                String originalColumnName = getColumnName(handle);
                return new Subfield(originalColumnName, unmodifiableList(elements));
            }

            if (currentRowExpression instanceof SpecialFormExpression && ((SpecialFormExpression) currentRowExpression).getForm() == DEREFERENCE) {
                SpecialFormExpression dereferenceExpression = (SpecialFormExpression) currentRowExpression;
                RowExpression base = dereferenceExpression.getArguments().get(0);
                RowType baseType = (RowType) base.getType();

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Report as a Presto planner bug with the query and explain plan
  2. Work around by disabling the parquet dereference pushdown rule
  3. Upgrade to a version where the rule handles the expression shape
Defensive patterns

Strategy: type-guard

When it happens

Trigger: Thrown at presto-parquet/src/main/java/com/facebook/presto/parquet/rule/ParquetDereferencePushDown.java:162 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04). Data as JSON: /api/errors/8659a39844657542. Report an issue: GitHub.