Skip to content

Where in array + dynamic limit and offset #170

@exAspArk

Description

@exAspArk

Hey!

I have a weird bug in my production application which I was able to reproduce in the repo with the latest master in test/mongo_ecto_test.exs:

  test "where in ids + dynamic limit + dynamic offset" do
    post1 = TestRepo.insert!(%Post{})
    post2 = TestRepo.insert!(%Post{})
    ids = [post1.id, post2.id]
    limit = 1
    offset = 1

    query = from p in Post, where: p.id in ^ids, limit: ^limit, offset: ^offset
    assert TestRepo.all(query) == [post2]
  end
  • When I try to use p.id in ^ids with limit: ^limit, it fails with the following error (the id from ids is somehow used as a count):
     ** (ArithmeticError) bad argument in arithmetic expression
     code: assert TestRepo.all(query) == [post2]
     stacktrace:
       :erlang.-(#BSON.ObjectId<5c40b5cdac013d9153aefc9f>, 1)
       (mongodb) lib/mongo/cursor.ex:106: Enumerable.Mongo.Cursor.new_limit/2
       (mongodb) lib/mongo/cursor.ex:44: anonymous fn/6 in Enumerable.Mongo.Cursor.start_fun/6
       (elixir) lib/stream.ex:1362: anonymous fn/5 in Stream.resource/3
       (elixir) lib/enum.ex:2979: Enum.map_reduce/3
       (mongodb_ecto) lib/mongo_ecto.ex:600: Mongo.Ecto.execute/6
       (ecto) lib/ecto/repo/queryable.ex:130: Ecto.Repo.Queryable.execute/5
       (ecto) lib/ecto/repo/queryable.ex:35: Ecto.Repo.Queryable.all/4
       test/mongo_ecto_test.exs:104: (test)
  • When I try to use p.id in ^ids with offset: ^offset, it fails with another error:
12:05:34.821 [error] GenServer #PID<0.295.0> terminating
** (DBConnection.ConnectionError) client #PID<0.309.0> stopped: ** (ArgumentError) argument error
    (mongodb) lib/mongo/messages.ex:116: Mongo.Messages.encode_op/1
    (mongodb) lib/mongo/messages.ex:59: Mongo.Messages.encode/2
    (mongodb) lib/mongo/protocol/utils.ex:32: Mongo.Protocol.Utils.send/3
    (mongodb) lib/mongo/protocol/utils.ex:12: Mongo.Protocol.Utils.message/3
    (mongodb) lib/mongo/protocol.ex:273: Mongo.Protocol.message_reply/2
    (mongodb) lib/mongo/protocol.ex:186: Mongo.Protocol.handle_execute/4
    (db_connection) lib/db_connection.ex:958: DBConnection.handle/4
    (db_connection) lib/db_connection.ex:1100: anonymous fn/4 in DBConnection.run_execute/4
    (db_connection) lib/db_connection.ex:1142: anonymous fn/4 in DBConnection.run_meter/5
    (db_connection) lib/db_connection.ex:1199: DBConnection.run_begin/3
    (db_connection) lib/db_connection.ex:636: DBConnection.execute/4
    (mongodb) lib/mongo.ex:414: Mongo.raw_find/5
    (mongodb) lib/mongo/cursor.ex:40: anonymous fn/6 in Enumerable.Mongo.Cursor.start_fun/6
    (elixir) lib/stream.ex:1362: anonymous fn/5 in Stream.resource/3
    (elixir) lib/enum.ex:2979: Enum.map_reduce/3
    (mongodb_ecto) lib/mongo_ecto.ex:600: Mongo.Ecto.execute/6
    (ecto) lib/ecto/repo/queryable.ex:130: Ecto.Repo.Queryable.execute/5
    (ecto) lib/ecto/repo/queryable.ex:35: Ecto.Repo.Queryable.all/4
    test/mongo_ecto_test.exs:105: Mongo.EctoTest."test where in + limit"/1
    (ex_unit) lib/ex_unit/runner.ex:312: ExUnit.Runner.exec_test/1
    (db_connection) lib/db_connection/connection.ex:243: DBConnection.Connection.handle_cast/2
    (connection) lib/connection.ex:810: Connection.handle_async/3
    (stdlib) gen_server.erl:637: :gen_server.try_dispatch/4
    (stdlib) gen_server.erl:711: :gen_server.handle_msg/6
    (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions