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

    • 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

        1. 12127.txt
          4 kB
          Brandon Williams

        Issue Links

          Activity

            People

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

              Dates

                Created:
                Updated:
                Resolved: