i faced a bug while writing composite column values and following validation on server side.
This is the setup for reproduction:
1. create a keyspace
create keyspace test with strategy_class = 'SimpleStrategy' and strategy_options:replication_factor = 1;
2. create a cf via cql (3.0)
create table test1 (
primary key (a, b)
If i have a look at the schema in cli i noticed that there is no column metadata for columns not part of primary key.
create column family test1
with column_type = 'Standard'
and comparator = 'CompositeType(org.apache.cassandra.db.marshal.Int32Type,org.apache.cassandra.db.marshal.UTF8Type)'
and default_validation_class = 'UTF8Type'
and key_validation_class = 'Int32Type'
and read_repair_chance = 0.1
and dclocal_read_repair_chance = 0.0
and gc_grace = 864000
and min_compaction_threshold = 4
and max_compaction_threshold = 32
and replicate_on_write = true
and compaction_strategy = 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'
and caching = 'KEYS_ONLY'
and compression_options =
Please notice the default validation class: UTF8Type
Now i would like to insert value > 127 via cassandra client (no cql, part of mr-jobs). Have a look at the attachement.
Batch mutate fails:
InvalidRequestException(why:(String didn't validate.) [test][test1][1:c] failed validation)
A validator for column value is fetched in ThriftValidation::validateColumnData which returns always the default validator which is UTF8Type as described above (The ColumnDefinition for given column name "c" is always null)
In UTF8Type there is a check for
if (b > 127)
Anyway, maybe i'm doing something wrong, but i used cql 3.0 for table creation. I assigned data types to all columns, but i can not set values for a composite column because the default validation class is used.
I think the schema should know the correct validator even for composite columns. The usage of the default validation class does not make sense.