prestodb/presto · error · SQLException
Value is not a number:
Error message
Value is not a number:
What it means
Thrown by PrestoResultSet's private number-extraction helper when getObject returned a value that is neither a Number nor a Boolean, so it cannot be converted to a numeric getX (e.g. getLong/getDouble) result. The JDBC driver only coerces numeric and boolean column values; anything else (string, struct, array, map, null object) is rejected. The class name of the offending value is appended to the message.
Source
Thrown at presto-jdbc/src/main/java/com/facebook/presto/jdbc/PrestoResultSet.java:1730
if (index == null) {
throw new SQLException("Invalid column label: " + label);
}
return index;
}
private static Number toNumber(Object value)
throws SQLException
{
if (value == null) {
return 0;
}
if (value instanceof Number) {
return (Number) value;
}
if (value instanceof Boolean) {
return ((Boolean) value) ? 1 : 0;
}
throw new SQLException("Value is not a number: " + value.getClass().getCanonicalName());
}
private static List<Column> getColumns(StatementClient client, Consumer<QueryStats> progressCallback)
throws SQLException
{
while (client.isRunning()) {
QueryStatusInfo results = client.currentStatusInfo();
progressCallback.accept(QueryStats.create(results.getId(), results.getStats()));
List<Column> columns = results.getColumns();
if (columns != null) {
return columns;
}
client.advance();
}
verify(client.isFinished());
QueryStatusInfo results = client.finalStatusInfo();
if (results.getError() == null) {View on GitHub (pinned to 55bb57d202)
Solutions
- Check the column's Presto type via ResultSetMetaData.getColumnType/getColumnTypeName before calling numeric getters
- Use getObject and convert manually for non-numeric types
- Fix the SELECT list so the column is cast to a numeric type in SQL, e.g. CAST(col AS BIGINT)
- Verify the column index passed to the getter points at the intended column
Example fix
// before long v = rs.getLong(3); // column 3 is VARCHAR // after String s = rs.getString(3); long v = Long.parseLong(s); // or CAST in SQL
Defensive patterns
Strategy: type-guard
Validate before calling
ResultSetMetaData md = rs.getMetaData();
String type = md.getColumnTypeName(col);
boolean numeric = type.matches("(TINYINT|SMALLINT|INTEGER|BIGINT|REAL|DOUBLE|DECIMAL).*");
if (!numeric) throw new IllegalStateException("Column " + col + " is " + type + ", not numeric"); Type guard
Object v = rs.getObject(col);
if (!(v instanceof Number || v instanceof Boolean)) {
throw new IllegalStateException("Expected numeric value, got " + (v == null ? "null" : v.getClass().getName()));
}
Number n = (v instanceof Boolean) ? (((Boolean) v) ? 1 : 0) : (Number) v; Try / catch
try {
long v = rs.getLong(col);
} catch (SQLException e) {
if (e.getMessage() != null && e.getMessage().startsWith("Value is not a number")) {
Object raw = rs.getObject(col); // handle non-numeric type explicitly
} else { throw e; }
} Prevention
- Check getColumnTypeName before numeric getters
- CAST non-numeric columns to numeric types in SQL when arithmetic is needed
- Use getString/getObject for VARCHAR, JSON, ARRAY, MAP, ROW columns
When it happens
Trigger: Calling a numeric getter (getLong, getInt, getDouble, etc.) on a column whose underlying Presto type deserializes to a non-Number Java object, e.g. a VARCHAR, ARRAY, MAP, ROW, or JSON column.
Common situations: Schema drift where a column changed from BIGINT to VARCHAR; developers reading a MAP/ARRAY column with getLong assuming a numeric type; using getString-style assumptions on JSON columns; retrieving the wrong column index and hitting a complex-typed column.
Related errors
- Invalid date from server:
- Expected column to be a timestamp type but is
- No wrapper for
- Result set type must be TYPE_FORWARD_ONLY
- Result set concurrency must be CONCUR_READ_ONLY
AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04).
Data as JSON: /api/errors/72e589f42be40bc1.
Report an issue: GitHub.