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
- Report as a Presto planner bug with the query and explain plan
- Work around by disabling the parquet dereference pushdown rule
- 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.