[
https://issues.apache.org/jira/browse/CASSANDRA-12127?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15359588#comment-15359588
]
Jason Brown commented on CASSANDRA-12127:
-----------------------------------------
In the interest in completeness, I've taken [~blerer] 's sample queries (the
difference being >, <, or = operators before {{textAsBlob()}}), and discovered
the following:
||op||2.0||2.1/2.2||3.0/trunk||
| {{>}} | return all partition rows | ClassCastException | return 2 rows |
| {{<}} | return all partition rows | ClassCastException | return 0 rows |
| {{=}} | "Invalid empty value for clustering column of COMPACT TABLE" |
AssertionError | return 0 rows |
As this behavior (passing an empty buffer to {{textAsBlob()}}) is allowable and
correct as of 3.0 and trunk, I propose we fix this for 2.1 and 2.2 (I suspect
it's the same fix, though I'm not very familiar with this part of the code
base). I agree with [~blerer] that the behavior in 2.0 was certainly buggy, but
the fact that it's working correctly in 3.0 and up indicates we should fix it
for the intervening versions.
> 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)