bson-erlang icon indicating copy to clipboard operation
bson-erlang copied to clipboard

Add support for encoding '+-infinity'

Open lafka opened this issue 9 years ago • 1 comments

Javascript (and therefore MongoDB) has a concept of +-Infinity. This works in other clients bson parsers (at least Haskells) but fails in Erlang (trace below)

Erlang can't process the float that is equivialant of Javascripts Infinity, Number.(POSITIVE,NEGATIVE)_INFINITY, which is the max- and minimum floating point.

This patch allows the BSON parser to atleast return something somewhat appropriate.

# try to query back
:poolboy.transaction :mongodb, fn(conn) -> :mongo.find_one(conn, :test, %{}) end
** (exit) exited in: :gen_server.call(#PID<0.3001.0>, {:query, false, false, false, false, :test, 0, -1, %{}, []}, :infinity)
    ** (EXIT) an exception was raised:
        ** (MatchError) no match of right hand side value: <<0, 0, 0, 0, 0, 0, 240, 127>>
            (bson) src/bson_binary.erl:87: :bson_binary.get_field/4
            (bson) src/bson_binary.erl:144: :bson_binary.get_field/2
            (bson) src/bson_binary.erl:54: :bson_binary.get_fields/2
            (bson) src/bson_binary.erl:40: :bson_binary.get_map/1
            (mongodb) src/core/mongo_protocol.erl:111: :mongo_protocol.get_docs/3
            (mongodb) src/core/mongo_protocol.erl:92: :mongo_protocol.get_reply/1
            (mongodb) src/connection/mc_worker_logic.erl:68: :mc_worker_logic.decode_responses/2
            (mongodb) src/connection/mc_worker.erl:102: :mc_worker.handle_info/2


Note on comparison

Since there is no concept of a minimum value both are atoms. This means you can compare any number to '+infinity" and it will always be larger; however '-infinity' will also be larger than any number... This means no +infinity > 0 > -infinity.

lafka avatar Oct 03 '15 04:10 lafka

Also NaN. For which there are multiple possible encodings. See my change at https://github.com/rlipscombe/bson-erlang/commit/b67b6ae.

rlipscombe avatar Mar 23 '16 12:03 rlipscombe