Benjamin Lerer created CASSANDRA-12127:
------------------------------------------

             Summary: Queries with empty ByteBuffer values in clustering column 
restrictions fail for non-composite compact tables
                 Key: CASSANDRA-12127
                 URL: https://issues.apache.org/jira/browse/CASSANDRA-12127
             Project: Cassandra
          Issue Type: Bug
            Reporter: Benjamin Lerer
            Assignee: Benjamin Lerer


For the following table:

{code}
CREATE TABLE myTable (pk int,
                      c blob,
                      value int,
                      PRIMARY KEY (pk, c)) WITH COMPACT STORAGE;
INSERT INTO myTable (pk, c, value) VALUES (1, textAsBlob('1'), 1);
INSERT INTO myTable (pk, c, value) VALUES (1, textAsBlob('2'), 2);
{code}

The query: {{SELECT * FROM myTable WHERE pk = 1 AND c > textAsBlob('');}}

Will result in the following Exception:

{code}
java.lang.ClassCastException: 
org.apache.cassandra.db.composites.Composites$EmptyComposite cannot be cast to 
org.apache.cassandra.db.composites.CellName
        at 
org.apache.cassandra.db.composites.AbstractCellNameType.cellFromByteBuffer(AbstractCellNameType.java:188)
        at 
org.apache.cassandra.db.composites.AbstractSimpleCellNameType.makeCellName(AbstractSimpleCellNameType.java:125)
        at 
org.apache.cassandra.db.composites.AbstractCellNameType.makeCellName(AbstractCellNameType.java:254)
        at 
org.apache.cassandra.cql3.statements.SelectStatement.makeExclusiveSliceBound(SelectStatement.java:1206)
        at 
org.apache.cassandra.cql3.statements.SelectStatement.applySliceRestriction(SelectStatement.java:1214)
        at 
org.apache.cassandra.cql3.statements.SelectStatement.processColumnFamily(SelectStatement.java:1292)
        at 
org.apache.cassandra.cql3.statements.SelectStatement.process(SelectStatement.java:1259)
        at 
org.apache.cassandra.cql3.statements.SelectStatement.processResults(SelectStatement.java:299)
        [...]
{code}

The query: {{SELECT * FROM myTable WHERE pk = 1 AND c < textAsBlob('');}}

Will return 2 rows instead of 0.

The query: {{SELECT * FROM myTable WHERE pk = 1 AND c = textAsBlob('');}}

{code}
java.lang.AssertionError
        at 
org.apache.cassandra.db.composites.SimpleDenseCellNameType.create(SimpleDenseCellNameType.java:60)
        at 
org.apache.cassandra.cql3.statements.SelectStatement.addSelectedColumns(SelectStatement.java:853)
        at 
org.apache.cassandra.cql3.statements.SelectStatement.getRequestedColumns(SelectStatement.java:846)
        at 
org.apache.cassandra.cql3.statements.SelectStatement.makeFilter(SelectStatement.java:583)
        at 
org.apache.cassandra.cql3.statements.SelectStatement.getSliceCommands(SelectStatement.java:383)
        at 
org.apache.cassandra.cql3.statements.SelectStatement.getPageableCommand(SelectStatement.java:253)
        [...]
{code}

I checked 2.0 and {{SELECT * FROM myTable  WHERE pk = 1 AND c > 
textAsBlob('');}} works properly but {{SELECT * FROM myTable WHERE pk = 1 AND c 
< textAsBlob('');}} return the same wrong results than in 2.1.
The {{SELECT * FROM myTable WHERE pk = 1 AND c = textAsBlob('');}} is rejected 
if a clear error message: {{Invalid empty value for clustering column of 
COMPACT TABLE}}.

As it is not possible to insert an empty ByteBuffer value within the clustering 
column of a non-composite compact tables those queries do not
have a lot of meaning. {{SELECT * FROM myTable WHERE pk = 1 AND c < 
textAsBlob('');}} and {{SELECT * FROM myTable WHERE pk = 1 AND c = 
textAsBlob('');}} will return nothing
and {{SELECT * FROM myTable WHERE pk = 1 AND c > textAsBlob('');}} will return 
the entire partition (pk = 1).

In my opinion those queries should probably all be rejected as it seems that 
the fact that {{SELECT * FROM myTable  WHERE pk = 1 AND c > textAsBlob('');}} 
was accepted in {{2.0}} was due to a bug.
I am of course open to discussion.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to