ResponseError : Expected 4 or 0 byte int

Gaurav Gupta picture Gaurav Gupta · Oct 31, 2014 · Viewed 8.9k times · Source

I am trying cassandra node driver and stuck in problem while inserting a record, it looks like cassandra driver is not able to insert float values.

Problem: When passing int value for insertion in db, api gives following error:
    Debug: hapi, internal, implementation, error 
        ResponseError: Expected 4 or 0 byte int (8)
        at FrameReader.readError (/home/gaurav/Gaurav-Drive/code/nodejsWorkspace/cassandraTest/node_modules/cassandra-driver/lib/readers.js:291:13)
        at Parser.parseError (/home/gaurav/Gaurav-Drive/code/nodejsWorkspace/cassandraTest/node_modules/cassandra-driver/lib/streams.js:185:45)
        at Parser.parseBody (/home/gaurav/Gaurav-Drive/code/nodejsWorkspace/cassandraTest/node_modules/cassandra-driver/lib/streams.js:167:19)
        at Parser._transform (/home/gaurav/Gaurav-Drive/code/nodejsWorkspace/cassandraTest/node_modules/cassandra-driver/lib/streams.js:101:10)
        at Parser.Transform._read (_stream_transform.js:179:10)
        at Parser.Transform._write (_stream_transform.js:167:12)
        at doWrite (_stream_writable.js:225:10)
        at writeOrBuffer (_stream_writable.js:215:5)
        at Parser.Writable.write (_stream_writable.js:182:11)
        at write (_stream_readable.js:601:24)

I am trying to execute following query from code:

INSERT INTO ragchews.user
(uid ,iid ,jid ,jpass ,rateCount ,numOfratedUser ,hndl ,interests ,locX ,locY ,city )
VALUES
('uid_1',{'iid1'},'jid_1','pass_1',25, 10, {'NEX1231'}, {'MUSIC'}, 21.321, 43.235, 'delhi');

parameter passed to execute() is

var params = [uid, iid, jid, jpass, rateCount, numOfratedUser, hndl, interest, locx, locy, city];

where

var locx = 32.09;
var locy = 54.90;

and call to execute looks like:

var addUserQuery = 'INSERT INTO ragchews.user (uid ,iid ,jid ,jpass ,rateCount ,numOfratedUser ,hndl ,interests ,locX ,locY ,city) VALUES (?,?,?,?,?,?,?,?,?,?,?);';
var addUser = function(user, cb){
    console.log(user);
    client.execute(addUserQuery, user, function(err, result){
        if(err){
            throw err;
        }
        cb(result);
    });
};

CREATE TABLE ragchews.user( 
    uid varchar,    
    iid set<varchar>,   
    jid varchar,    
    jpass varchar,  
    rateCount int,  
    numOfratedUser int, 
    hndl set<varchar>,  
    interests set<varchar>, 
    locX float, 
    locY float, 
    city varchar,   
    favorite map<varchar, varchar>, 
    PRIMARY KEY(uid)
);

P.S Some observations while trying to understand the issue:

  1. Since it seems, problem is with float so i changed type float (of locX, locY) to int and re-run the code. Same error persist. Hence, it is not problem associated specifically to float CQL type.
  2. Next, i attempted to remove all int from the INSERT query and attempted to insert only non-numeric values. This attempt successfully inputted the value into db. Hence it looks like now that, this problem may be associated with numeric types.

Answer

Gaurav Gupta picture Gaurav Gupta · Oct 31, 2014

Following words are as it is picked from cassandra node driver data type documentation

When encoding data, on a normal execute with parameters, the driver tries to guess the target type based on the input type. Values of type Number will be encoded as double (as Number is double / IEEE 754 value).

Consider the following example:

var key = 1000;
client.execute('SELECT * FROM table1 where key = ?', [key], callback);

If the key column is of type int, the execution fails. There are two possible ways to avoid this type of problem:

  1. Prepare the data (recommended) - prepare the query before execution

    client.execute('SELECT * FROM table1 where key = ?', [key], { prepare : true }, callback);

  2. Hinting the target types - Hint: the first parameter is an integer`

    client.execute('SELECT * FROM table1 where key = ?', [key], { hints : ['int'] }, callback);

If you are dealing with batch update then this issue may be of your interest.