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]

Reply via email to