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: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org