Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ResponseError : Expected 4 or 0 byte int

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.
like image 230
Gaurav Gupta Avatar asked Oct 31 '14 20:10

Gaurav Gupta


1 Answers

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.

like image 107
Gaurav Gupta Avatar answered Oct 13 '22 05:10

Gaurav Gupta