Details
Description
Somewhere between the view server and the client, large integer values are having .0 appended to make them look like floats.
This is OK:
$ curl -X POST -d '{"map":"function(doc)
{ emit(2000000000,null); }"}' http://127.0.0.1:5984/test_suite_db/_temp_view
{"total_rows":3,"offset":0,"rows":[ {"id":"bar","key":2000000000,"value":null},
{"id":"baz","key":2000000000,"value":null},
{"id":"foo","key":2000000000,"value":null}]}
But here's a large integer getting the .0 appended:
$ curl -X POST -d '{"map":"function(doc)
{ emit(1262958680124,null); }"}' http://127.0.0.1:5984/test_suite_db/_temp_view {"total_rows":3,"offset":0,"rows":[ {"id":"bar","key":1262958680124.0,"value":null}, {"id":"baz","key":1262958680124.0,"value":null}, {"id":"foo","key":1262958680124.0,"value":null}]}
And some values are getting turned into exponential format:
$ curl -X POST -d '{"map":"function(doc) { emit(3000000000,null); }"}' http://127.0.0.1:5984/test_suite_db/_temp_view {"total_rows":3,"offset":0,"rows":[ {"id":"bar","key":3.0e+9,"value":null}, {"id":"baz","key":3.0e+9,"value":null}, {"id":"foo","key":3.0e+9,"value":null}
]}
It appears to affect integers larger than 2^31, but these are still much smaller than the 2^48 mantissa of IEEE double precision (which Javascript uses). Hence they should be accurately represented as integers, not floats.
If I run the view server by itself from the command line, all works properly:
$ bin/couchjs share/server/main.js
["reset"]
true
["add_fun","function(doc) { emit(1262958680124,null); }
"]
true
["add_fun","function(doc)
"]
true
["map_doc",{}]
[[[1262958680124,null]], [[3000000000,null]]]
Therefore it looks like the problem is in the Erlang JSON deserialisation side. i.e. it's not keeping these values as large integers, when it could be.
NOTE: I have another machine, running a similar recent couchdb trunk (0.11.0b894828) plus Ubuntu Karmic Server Edition built against libmozjs 1.8.1.16 (not xulrunner). This exhibits the same behaviour as above.
But the problem doesn't appear on another, older CouchDB installation I have. This is 0.11.0a813819 running under Ubuntu Hardy, with erlang 12.b.5 and libmozjs 1.8.1.18
{"total_rows":1,"offset":0,"rows":[ {"id":"person","key":3000000000,"value":null}]}