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
- Compare the table list printed in the error message and correct the table name in the query
- Check the exact table name in Pinot (curl /v2/tables) including _REALTIME/_OFFLINE suffixes
- Confirm the table still exists — it may have been dropped after catalog listing
- 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
- Copy table names from Pinot's table list API, not from memory
- Be aware of REALTIME/OFFLINE name suffixes when both exist
- Watch for dropped tables referenced by stale dashboards or saved queries
- Use consistent identifier casing between clients and Pinot
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
- ACCUMULO_TABLE_DNE
- NOT_FOUND
- ACCUMULO_TABLE_DNE
- TABLE_NOT_FOUND
- Table not found: ${databaseName}.${tableName}
AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04).
Data as JSON: /api/errors/f752a0ac12c3a0c4.
Report an issue: GitHub.