Uploaded image for project: 'Cassandra'
  1. Cassandra
  2. CASSANDRA-12127

Queries with empty ByteBuffer values in clustering column restrictions fail for non-composite compact tables

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: Normal
    • Resolution: Fixed
    • Fix Version/s: 2.1.16, 2.2.8, 3.0.9
    • Component/s: Legacy/CQL
    • Labels:
      None
    • Severity:
      Normal

      Description

      For the following table:

      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);
      

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

      Will result in the following Exception:

      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)
      	[...]
      

      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('');

      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)
      	[...]
      

      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.

        Attachments

        1. 12127.txt
          4 kB
          Brandon Williams

          Issue Links

            Activity

              People

              • Assignee:
                blerer Benjamin Lerer
                Reporter:
                blerer Benjamin Lerer
                Authors:
                Benjamin Lerer
                Reviewers:
                Jason Brown
              • Votes:
                0 Vote for this issue
                Watchers:
                10 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: