[ 
https://issues.apache.org/jira/browse/CASSANDRA-20596?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jon Haddad updated CASSANDRA-20596:
-----------------------------------
    Attachment: corrupt.zip

> 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
>            Priority: Normal
>         Attachments: corrupt.zip
>
>
> 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

Reply via email to