prestodb/presto · warning · PinotException

PINOT_UNSUPPORTED_EXPRESSION

PINOT_UNSUPPORTED_EXPRESSION

Error message

%s

What it means

checkSupported is the Pinot connector's generic guard: when a condition guaranteeing translatable SQL is not met, it throws PinotException with code PINOT_UNSUPPORTED_EXPRESSION carrying the caller-supplied message. The connector only pushes down constructs it can express in Pinot query syntax, so anything else is rejected at planning time.

Source

Thrown at presto-pinot-toolkit/src/main/java/com/facebook/presto/pinot/PinotPushdownUtils.java:126

            this.callExpression = callExpression;
        }

        public CallExpression getCallExpression()
        {
            return callExpression;
        }

        @Override
        public String toString()
        {
            return callExpression.toString();
        }
    }

    public static void checkSupported(boolean condition, String errorMessage, Object... errorMessageArgs)
    {
        if (!condition) {
            throw new PinotException(PINOT_UNSUPPORTED_EXPRESSION, Optional.empty(), String.format(errorMessage, errorMessageArgs));
        }
    }

    public abstract static class AggregationColumnNode
    {
        private final ExpressionType expressionType;
        private final VariableReferenceExpression outputColumn;

        public AggregationColumnNode(ExpressionType expressionType, VariableReferenceExpression outputColumn)
        {
            this.expressionType = expressionType;
            this.outputColumn = outputColumn;
        }

        public VariableReferenceExpression getOutputColumn()
        {
            return outputColumn;
        }

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Rewrite the query to avoid the unsupported construct (e.g. simplify the WHERE clause or use a supported function)
  2. Use the exact message in the exception to identify which expression failed and replace it with a Pinot-compatible equivalent
  3. If the expression must be supported, filter rows outside the connector (e.g. wrap the query or fetch raw data and post-process)
  4. Check connector docs/release notes; newer Presto/Pinot versions may support the construct, so upgrade

Example fix

// before
SELECT * FROM t WHERE regexp_like(col, 'a.*')
// after
SELECT * FROM t WHERE col LIKE 'a%'
Defensive patterns

Strategy: try-catch

Validate before calling

// pre-check that pushed predicates only use supported functions
// keep WHERE clauses to comparisons with literal right-hand sides
// avoid regexp/UDF-style functions in pushdown-eligible queries

Try / catch

try {
    query.execute();
} catch (PinotException e) {
    if (e.getErrorCode() == PINOT_UNSUPPORTED_EXPRESSION.toErrorCode().getCode()) {
        // fall back to a non-pushdown plan or rewrite the query
    } else {
        throw e;
    }
}

Prevention

When it happens

Trigger: Any call to PinotPushdownUtils.checkSupported(false, ...) during pushdown planning, e.g. an expression, function, or clause the connector cannot translate into Pinot PQL/SQL.

Common situations: Querying with functions Pinot lacks (e.g. regexp predicates, exotic types), filters on unsupported expressions like non-literal right sides, or IS NULL on array/map types.

Related errors


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