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

Agile BoardAttach filesAttach ScreenshotVotersWatch issueWatchersCreate sub-taskConvert to sub-taskMoveLinkCloneLabelsUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Normal
    • Resolution: Fixed
    • 2.1.16, 2.2.8, 3.0.9
    • Legacy/CQL
    • None
    • 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

        Issue Links

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            blerer Benjamin Lerer Assign to me
            blerer Benjamin Lerer
            Benjamin Lerer
            Jason Brown
            Votes:
            0 Vote for this issue
            Watchers:
            10 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Issue deployment