Details
-
Bug
-
Status: Resolved
-
Normal
-
Resolution: Fixed
-
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
Attachments
Issue Links
- relates to
-
CASSANDRA-14462 CAS temporarily broken on reversed tables after upgrading on 2.1.X or 2.2.X
- Open