prestodb/presto · error · PinotException

PINOT_UNCLASSIFIED_ERROR

PINOT_UNCLASSIFIED_ERROR

Error message

Unable to find the presto table %s in %s

What it means

getPinotTableNameFromPrestoTableName normalizes the Presto table name and scans all known Pinot table names for a case-normalized match; if none matches, it throws PINOT_UNCLASSIFIED_ERROR listing the requested name and the available tables.

Source

Thrown at presto-pinot-toolkit/src/main/java/com/facebook/presto/pinot/PinotMetadata.java:80

    }

    @Override
    public List<String> listSchemaNames(ConnectorSession session)
    {
        return ImmutableList.of(SCHEMA_NAME);
    }

    private String getPinotTableNameFromPrestoTableName(ConnectorSession session, String prestoTableName)
    {
        List<String> allTables = pinotPrestoConnection.getTableNames();
        String normalizedPrestoTableName = normalizeIdentifier(session, prestoTableName);
        for (String pinotTableName : allTables) {
            String normalizedPinotTableName = normalizeIdentifier(session, pinotTableName);
            if (normalizedPrestoTableName.equals(normalizedPinotTableName)) {
                return pinotTableName;
            }
        }
        throw new PinotException(PINOT_UNCLASSIFIED_ERROR, Optional.empty(), "Unable to find the presto table " + prestoTableName + " in " + allTables);
    }

    @Override
    public PinotTableHandle getTableHandle(ConnectorSession session, SchemaTableName tableName)
    {
        if (!SCHEMA_NAME.equals(normalizeIdentifier(session, tableName.getSchemaName()))) {
            throw new PrestoException(NOT_FOUND, format("Schema %s does not exist", tableName.getSchemaName()));
        }
        String pinotTableName = getPinotTableNameFromPrestoTableName(session, tableName.getTableName());
        return new PinotTableHandle(connectorId, tableName.getSchemaName(), pinotTableName);
    }

    @Override
    public ConnectorTableLayoutResult getTableLayoutForConstraint(
            ConnectorSession session,
            ConnectorTableHandle table,
            Constraint<ColumnHandle> constraint,
            Optional<Set<ColumnHandle>> desiredColumns)

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Compare the table list printed in the error message and correct the table name in the query
  2. Check the exact table name in Pinot (curl /v2/tables) including _REALTIME/_OFFLINE suffixes
  3. Confirm the table still exists — it may have been dropped after catalog listing
  4. Configure pinot.table-names or normalize identifiers consistently if case handling is the issue

Example fix

// before
SELECT * FROM pinot.default.saleseventt
// after
SELECT * FROM pinot.default.salesevent -- matches actual Pinot table name
Defensive patterns

Strategy: validation

Validate before calling

// Check the exact table name registered in Pinot before querying
curl -s http://<controller>:9000/v2/tables | jq '.tables[].name'

Try / catch

try {
    connector.getTableHandle(session, schemaTableName);
} catch (PrestoException | PinotException e) {
    if (e.getMessage().startsWith("Unable to find the presto table")) {
        // surface the valid table list from the message to the user
    }
    throw e;
}

Prevention

When it happens

Trigger: A query references a table whose normalized name does not equal any entry in the controller's list of tables (allTables), e.g. SELECT from a table that doesn't exist or has different casing/REALTIME/OFFLINE suffixing.

Common situations: Typo in table name; querying a table that exists only as an OFFLINE table under a name variant; case sensitivity mismatch when Pinot returns names like SalesEvent_OFFLINE but the query used salesevent; table dropped between listing and query.

Related errors


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