apache/cassandra · error · MarshalException
Unable to make boolean from '%s'
Error message
Unable to make boolean from '%s'
What it means
BooleanType.fromString throws this when the input string is neither 'true' nor 'false' (case-insensitive). Cassandra's boolean parser accepts only these two literals; anything else (including '1', 'yes', or values with stray whitespace) is rejected. The failing string is included in the message.
Source
Thrown at src/java/org/apache/cassandra/db/marshal/BooleanType.java:93
@Override
public <V> V fromComparableBytes(ValueAccessor<V> accessor, ByteSource.Peekable comparableBytes, ByteComparable.Version version)
{
if (comparableBytes == null)
return accessor.empty();
int b = comparableBytes.next();
return accessor.valueOf(b == 1);
}
public ByteBuffer fromString(String source) throws MarshalException
{
if (source.isEmpty()|| source.equalsIgnoreCase(Boolean.FALSE.toString()))
return decompose(false);
if (source.equalsIgnoreCase(Boolean.TRUE.toString()))
return decompose(true);
throw new MarshalException(String.format("Unable to make boolean from '%s'", source));
}
@Override
public Term fromJSONObject(Object parsed) throws MarshalException
{
if (parsed instanceof String)
return new Constants.Value(fromString((String) parsed));
else if (!(parsed instanceof Boolean))
throw new MarshalException(String.format(
"Expected a boolean value, but got a %s: %s", parsed.getClass().getSimpleName(), parsed));
return new Constants.Value(getSerializer().serialize((Boolean) parsed));
}
@Override
public String toJSONString(ByteBuffer buffer, ProtocolVersion protocolVersion)
{
return getSerializer().deserialize(buffer).toString();View on GitHub (pinned to 88fd0f6a0e)
Solutions
- Use the exact literals true or false (any case, no extra whitespace)
- Convert 0/1 or yes/no to true/false in the import/ETL layer
- If column holds numeric flags, change type to tinyint and store 0/1
- Trim and normalize the value before binding: value.trim().toLowerCase()
Example fix
// before INSERT INTO t (k, flag) VALUES (1, 'yes'); // after INSERT INTO t (k, flag) VALUES (1, true);
Defensive patterns
Strategy: validation
Validate before calling
public static void assertBooleanLiteral(String s) {
String t = s == null ? null : s.trim().toLowerCase();
if (!"true".equals(t) && !"false".equals(t))
throw new IllegalArgumentException("Not a boolean literal: " + s);
} Prevention
- Normalize 0/1, yes/no to true/false at the ETL boundary
- Trim inputs before binding
- Use typed driver setters (setBool) instead of string literals
- Document allowed literals for import pipelines
When it happens
Trigger: INSERT with '1'/'yes'/'on' or whitespace-padded variants into a boolean column via the fromString path; fromJSONObject with a string that is not true/false; localized boolean representations (e.g. 'vrai').
Common situations: Data imported from CSVs using 0/1 or yes/no conventions; config-driven inserts where booleans render with trailing whitespace; shell env vars carrying '1' for boolean flags.
Understand the failure class
Background: "Invalid ... format", "must be in format X", "does not look like a ..." — invalid argument format errors across CLI tools and libraries — this error's family across 17 libraries.
Related errors
- Expected a boolean value, but got a %s: %s
- Unable to make short from '%s'
- Cannot parse 32-bits int value from "%s"
- Cannot parse timestamp value from "%s"
- Cannot parse date value from "%s"
AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10).
Data as JSON: /api/errors/639638d9cea15147.
Report an issue: GitHub.