Piotr Kolaczkowski created CASSANDRA-18576:
----------------------------------------------
Summary: Mixed single-column and multi-column clustering
restrictions are not merged correctly
Key: CASSANDRA-18576
URL: https://issues.apache.org/jira/browse/CASSANDRA-18576
Project: Cassandra
Issue Type: Bug
Components: CQL/Interpreter
Reporter: Piotr Kolaczkowski
Assignee: Piotr Kolaczkowski
During working on CEP-29, I found that single-column and multi-column
clustering restrictions are not merged correctly and cause query failures or
incorrect results.
Reproduction:
```
createTable("CREATE TABLE %s (pk int, c1 int, c2 int, v int, primary
key(pk, c1, c2)) WITH CLUSTERING ORDER BY (c1 DESC, c2 ASC)");
execute("INSERT INTO %s (pk, c1, c2, v) values (?, ?, ?, ?)", 1, 0, 1,
11);
execute("INSERT INTO %s (pk, c1, c2, v) values (?, ?, ?, ?)", 1, 0, 2,
12);
execute("INSERT INTO %s (pk, c1, c2, v) values (?, ?, ?, ?)", 1, 0, 3,
13);
execute("INSERT INTO %s (pk, c1, c2, v) values (?, ?, ?, ?)", 1, 0, 4,
14);
execute("INSERT INTO %s (pk, c1, c2, v) values (?, ?, ?, ?)", 1, 1, 1,
21);
execute("INSERT INTO %s (pk, c1, c2, v) values (?, ?, ?, ?)", 1, 1, 2,
22);
execute("INSERT INTO %s (pk, c1, c2, v) values (?, ?, ?, ?)", 1, 1, 3,
23);
execute("INSERT INTO %s (pk, c1, c2, v) values (?, ?, ?, ?)", 1, 1, 4,
24);
assertRows(execute("SELECT * FROM %s WHERE pk = ? AND c1 < ? AND (c1,
c2) > ?",
1, tuple(0, 1), 1),
row(1, 0, 2, 12),
row(1, 0, 3, 13),
row(1, 0, 4, 14));
```
In this particular case the message is:
```
org.apache.cassandra.serializers.MarshalException: Not enough bytes to read 0th
component
at org.apache.cassandra.db.marshal.TupleType.split(TupleType.java:312)
at org.apache.cassandra.db.marshal.TupleType.split(TupleType.java:286)
at
org.apache.cassandra.cql3.Tuples$Value.fromSerialized(Tuples.java:156)
at org.apache.cassandra.cql3.Tuples$Marker.bind(Tuples.java:398)
at org.apache.cassandra.cql3.Tuples$Marker.bind(Tuples.java:386)
at
org.apache.cassandra.cql3.restrictions.MultiColumnRestriction$SliceRestriction.componentBounds(MultiColumnRestriction.java:527)
at
org.apache.cassandra.cql3.restrictions.MultiColumnRestriction$SliceRestriction.appendBoundTo(MultiColumnRestriction.java:390)
at
org.apache.cassandra.cql3.restrictions.ClusteringColumnRestrictions.boundsAsClustering(ClusteringColumnRestrictions.java:134)
at
org.apache.cassandra.cql3.restrictions.StatementRestrictions.getClusteringColumnsBounds(StatementRestrictions.java:783)
at
org.apache.cassandra.cql3.statements.SelectStatement.makeSlices(SelectStatement.java:737)
at
org.apache.cassandra.cql3.statements.SelectStatement.makeClusteringIndexFilter(SelectStatement.java:716)
at
org.apache.cassandra.cql3.statements.SelectStatement.getSliceCommands(SelectStatement.java:616)
at
org.apache.cassandra.cql3.statements.SelectStatement.getQuery(SelectStatement.java:315)
at
org.apache.cassandra.cql3.statements.SelectStatement.executeInternal(SelectStatement.java:483)
at
org.apache.cassandra.cql3.statements.SelectStatement.executeLocally(SelectStatement.java:469)
at
org.apache.cassandra.cql3.statements.SelectStatement.executeLocally(SelectStatement.java:97)
```
If you reorder the restrictions so that the restriction (c1, c2) > ? comes
before the single column restriction on c1, the test passes.
The algorithm used in `RestrictionSet.mergeRestrictions` is incorrect, as its
results depend on the order of restrictions in a hashset.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]