Jon Haddad created CASSANDRA-20596:
--------------------------------------
Summary: NPE when executing IF block in transactions with invalid
comparison
Key: CASSANDRA-20596
URL: https://issues.apache.org/jira/browse/CASSANDRA-20596
Project: Apache Cassandra
Issue Type: Bug
Components: Accord
Reporter: Jon Haddad
I managed to catch a NPE when trying to execute a transaction. This came about
from an error in my syntax, but I think we should handle this more gracefully.
Here's the setup:
{noformat}
create KEYSPACE games WITH replication = {'class': 'SimpleStrategy',
'replication_factor': 1};
USE games;
CREATE TABLE games.high_scores_by_user ( user text, game text, score int,
primary key(user, game))
WITH compaction = {'class': 'UnifiedCompactionStrategy', 'scaling_parameters':
'L10'}
AND transactional_mode = 'full';
CREATE TABLE games.leaderboard (game text, score int, user text, primary key
(game, score, user))
WITH compaction = {'class': 'UnifiedCompactionStrategy', 'scaling_parameters':
'L10'}
AND clustering order by (score DESC, user ASC)
AND transactional_mode = 'full';
{noformat}
The query:
{noformat}
BEGIN TRANSACTION
LET high_score = (SELECT * from games.high_scores_by_user WHERE user = 'jon'
and game = 'pictionary');
SELECT high_score.score;
IF high_score = 100 THEN
INSERT INTO games.high_scores_by_user (game, score, user) VALUES
('pictionary', 110, 'jon');
INSERT INTO games.leaderboard (game, score, user) VALUES ('pictionary', 110,
'jon');
DELETE from games.leaderboard WHERE user = 'jon' AND game = 'pictionary' AND
score = 100;
END IF
COMMIT TRANSACTION;{noformat}
In the IF block I forgot to put the field I was comparing, it should have been
high_score.score, and got the following:
{noformat}
NoHostAvailable: ('Unable to complete the operation against any hosts', {<Host:
127.0.0.1:9042 datacenter1>: <Error from server: code=0000 [Server error]
message="java.lang.NullPointerException: Cannot read field "type" because
"receiver" is null">}){noformat}
On the server side, I see this:
{noformat}
ERROR [Native-Transport-Requests-1] 2025-04-24 16:00:15,711
QueryMessage.java:130 - Unexpected error during query
java.lang.NullPointerException: Cannot read field "type" because "receiver" is
null
at
org.apache.cassandra.cql3.terms.Constants$Literal.testAssignment(Constants.java:326)
at
org.apache.cassandra.cql3.terms.Constants$Literal.prepare(Constants.java:295)
at
org.apache.cassandra.cql3.terms.Constants$Literal.prepare(Constants.java:243)
at
org.apache.cassandra.cql3.transactions.ConditionStatement$Raw.prepare(ConditionStatement.java:105)
at
org.apache.cassandra.cql3.statements.TransactionStatement$Parsed.prepare(TransactionStatement.java:734)
at
org.apache.cassandra.cql3.QueryProcessor.getStatement(QueryProcessor.java:911)
at org.apache.cassandra.cql3.QueryProcessor.parse(QueryProcessor.java:360)
at
org.apache.cassandra.transport.messages.QueryMessage.execute(QueryMessage.java:116)
at org.apache.cassandra.transport.Message$Request.execute(Message.java:259)
at
org.apache.cassandra.transport.Dispatcher.processRequest(Dispatcher.java:423)
at
org.apache.cassandra.transport.Dispatcher.processRequest(Dispatcher.java:442)
at
org.apache.cassandra.transport.Dispatcher.processRequest(Dispatcher.java:469)
at
org.apache.cassandra.transport.Dispatcher$RequestProcessor.run(Dispatcher.java:314)
at org.apache.cassandra.concurrent.FutureTask$1.call(FutureTask.java:99)
at org.apache.cassandra.concurrent.FutureTask.call(FutureTask.java:61)
at org.apache.cassandra.concurrent.FutureTask.run(FutureTask.java:71)
at org.apache.cassandra.concurrent.SEPWorker.run(SEPWorker.java:145)
at
io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:840){noformat}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]