You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by "Pranav (Jira)" <ji...@apache.org> on 2025/05/10 04:14:00 UTC

[jira] [Assigned] (CASSANDRA-20596) NPE when executing IF block in transactions with invalid comparison

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

Pranav reassigned CASSANDRA-20596:
----------------------------------

    Assignee: Pranav

> 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
>            Assignee: Pranav
>            Priority: Normal
>             Fix For: 5.x
>
>         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-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org