Uploaded image for project: 'Core Server'
  1. Core Server
  2. SERVER-49852

[SBE] Using dot notation with numeric field names (ex. "a.0") is broken in some cases

    • Type: Icon: Bug Bug
    • Resolution: Unresolved
    • Priority: Icon: Major - P3 Major - P3
    • None
    • Affects Version/s: None
    • Component/s: Querying
    • Query Execution
    • ALL
    • Hide

       

      > db.c.find({}, {_id: 0})
      { "a" : 42 }
      { "a" : [ 42 ] }
      { "a" : { "0" : 42 } }
      { "a" : [ [ 42 ] ] }
      { "a" : [ { "0" : 42 } ] }
      { "a" : { "0" : [ 42 ] } }
      { "a" : { "0" : { "0" : 42 } } }
      { "a" : [ [ [ 42 ] ] ] }
      { "a" : [ [ { "0" : 42 } ] ] }
      { "a" : [ { "0" : [ 42 ] } ] }
      { "a" : [ { "0" : { "0" : 42 } } ] }
      { "a" : { "0" : [ [ 42 ] ] } }
      { "a" : { "0" : [ { "0" : 42 } ] } }
      { "a" : { "0" : { "0" : [ 42 ] } } }
      { "a" : { "0" : { "0" : { "0" : 42 } } } }
      { "a" : [ [ [ [ 42 ] ] ] ] }
      { "a" : [ [ [ { "0" : 42 } ] ] ] }
      { "a" : [ [ { "0" : [ 42 ] } ] ] }
      { "a" : [ [ { "0" : { "0" : 42 } } ] ] }
      { "a" : [ { "0" : [ [ 42 ] ] } ] }
      { "a" : [ { "0" : [ { "0" : 42 } ] } ] }
      { "a" : [ { "0" : { "0" : [ 42 ] } } ] }
      { "a" : [ { "0" : { "0" : { "0" : 42 } } } ] }
      { "a" : { "0" : [ [ [ 42 ] ] ] } }
      { "a" : { "0" : [ [ { "0" : 42 } ] ] } }
      { "a" : { "0" : [ { "0" : [ 42 ] } ] } }
      { "a" : { "0" : [ { "0" : { "0" : 42 } } ] } }
      { "a" : { "0" : { "0" : [ [ 42 ] ] } } }
      { "a" : { "0" : { "0" : [ { "0" : 42 } ] } } }
      { "a" : { "0" : { "0" : { "0" : [ 42 ] } } } }
      { "a" : { "0" : { "0" : { "0" : { "0" : 42 } } } } }
      > db.adminCommand({setParameter: 1, internalQueryEnableSlotBasedExecutionEngine: false})
      { "was" : false, "ok" : 1 }
      > db.c.find({"a.0": 42}, {_id:0})
      { "a" : [ 42 ] }
      { "a" : { "0" : 42 } }
      { "a" : [ { "0" : 42 } ] }
      { "a" : { "0" : [ 42 ] } }
      { "a" : [ { "0" : [ 42 ] } ] }
      > db.c.find({"a.0.0": 42}, {_id:0})
      { "a" : [ [ 42 ] ] }
      { "a" : [ { "0" : 42 } ] }
      { "a" : { "0" : [ 42 ] } }
      { "a" : { "0" : { "0" : 42 } } }
      { "a" : [ [ { "0" : 42 } ] ] }
      { "a" : [ { "0" : [ 42 ] } ] }
      { "a" : [ { "0" : { "0" : 42 } } ] }
      { "a" : { "0" : [ { "0" : 42 } ] } }
      { "a" : { "0" : { "0" : [ 42 ] } } }
      { "a" : [ [ { "0" : [ 42 ] } ] ] }
      { "a" : [ { "0" : [ { "0" : 42 } ] } ] }
      { "a" : [ { "0" : { "0" : [ 42 ] } } ] }
      { "a" : { "0" : [ { "0" : [ 42 ] } ] } }
      > db.adminCommand({setParameter: 1, internalQueryEnableSlotBasedExecutionEngine: true})
      { "was" : false, "ok" : 1 }
      > db.c.find({"a.0": 42}, {_id:0})
      { "a" : { "0" : 42 } }
      { "a" : [ { "0" : 42 } ] }
      { "a" : { "0" : [ 42 ] } }
      { "a" : [ { "0" : [ 42 ] } ] }
      > db.c.find({"a.0.0": 42}, {_id:0})
      { "a" : { "0" : { "0" : 42 } } }
      { "a" : [ { "0" : { "0" : 42 } } ] }
      { "a" : { "0" : [ { "0" : 42 } ] } }
      { "a" : { "0" : { "0" : [ 42 ] } } }
      { "a" : [ { "0" : [ { "0" : 42 } ] } ] }
      { "a" : [ { "0" : { "0" : [ 42 ] } } ] }
      { "a" : { "0" : [ { "0" : [ 42 ] } ] } }

       

       

      Show
        > db.c.find({}, {_id: 0}) { "a" : 42 } { "a" : [ 42 ] } { "a" : { "0" : 42 } } { "a" : [ [ 42 ] ] } { "a" : [ { "0" : 42 } ] } { "a" : { "0" : [ 42 ] } } { "a" : { "0" : { "0" : 42 } } } { "a" : [ [ [ 42 ] ] ] } { "a" : [ [ { "0" : 42 } ] ] } { "a" : [ { "0" : [ 42 ] } ] } { "a" : [ { "0" : { "0" : 42 } } ] } { "a" : { "0" : [ [ 42 ] ] } } { "a" : { "0" : [ { "0" : 42 } ] } } { "a" : { "0" : { "0" : [ 42 ] } } } { "a" : { "0" : { "0" : { "0" : 42 } } } } { "a" : [ [ [ [ 42 ] ] ] ] } { "a" : [ [ [ { "0" : 42 } ] ] ] } { "a" : [ [ { "0" : [ 42 ] } ] ] } { "a" : [ [ { "0" : { "0" : 42 } } ] ] } { "a" : [ { "0" : [ [ 42 ] ] } ] } { "a" : [ { "0" : [ { "0" : 42 } ] } ] } { "a" : [ { "0" : { "0" : [ 42 ] } } ] } { "a" : [ { "0" : { "0" : { "0" : 42 } } } ] } { "a" : { "0" : [ [ [ 42 ] ] ] } } { "a" : { "0" : [ [ { "0" : 42 } ] ] } } { "a" : { "0" : [ { "0" : [ 42 ] } ] } } { "a" : { "0" : [ { "0" : { "0" : 42 } } ] } } { "a" : { "0" : { "0" : [ [ 42 ] ] } } } { "a" : { "0" : { "0" : [ { "0" : 42 } ] } } } { "a" : { "0" : { "0" : { "0" : [ 42 ] } } } } { "a" : { "0" : { "0" : { "0" : { "0" : 42 } } } } } > db.adminCommand({setParameter: 1, internalQueryEnableSlotBasedExecutionEngine: false}) { "was" : false, "ok" : 1 } > db.c.find({"a.0": 42}, {_id:0}) { "a" : [ 42 ] } { "a" : { "0" : 42 } } { "a" : [ { "0" : 42 } ] } { "a" : { "0" : [ 42 ] } } { "a" : [ { "0" : [ 42 ] } ] } > db.c.find({"a.0.0": 42}, {_id:0}) { "a" : [ [ 42 ] ] } { "a" : [ { "0" : 42 } ] } { "a" : { "0" : [ 42 ] } } { "a" : { "0" : { "0" : 42 } } } { "a" : [ [ { "0" : 42 } ] ] } { "a" : [ { "0" : [ 42 ] } ] } { "a" : [ { "0" : { "0" : 42 } } ] } { "a" : { "0" : [ { "0" : 42 } ] } } { "a" : { "0" : { "0" : [ 42 ] } } } { "a" : [ [ { "0" : [ 42 ] } ] ] } { "a" : [ { "0" : [ { "0" : 42 } ] } ] } { "a" : [ { "0" : { "0" : [ 42 ] } } ] } { "a" : { "0" : [ { "0" : [ 42 ] } ] } } > db.adminCommand({setParameter: 1, internalQueryEnableSlotBasedExecutionEngine: true}) { "was" : false, "ok" : 1 } > db.c.find({"a.0": 42}, {_id:0}) { "a" : { "0" : 42 } } { "a" : [ { "0" : 42 } ] } { "a" : { "0" : [ 42 ] } } { "a" : [ { "0" : [ 42 ] } ] } > db.c.find({"a.0.0": 42}, {_id:0}) { "a" : { "0" : { "0" : 42 } } } { "a" : [ { "0" : { "0" : 42 } } ] } { "a" : { "0" : [ { "0" : 42 } ] } } { "a" : { "0" : { "0" : [ 42 ] } } } { "a" : [ { "0" : [ { "0" : 42 } ] } ] } { "a" : [ { "0" : { "0" : [ 42 ] } } ] } { "a" : { "0" : [ { "0" : [ 42 ] } ] } }    
    • Query 2020-11-02, Query 2020-11-30, Query 2020-12-14, Query 2020-12-28, Query 2021-01-11, Query 2021-01-25, QE 2024-03-04, QE 2024-03-18, QE 2024-04-01, QE 2024-04-15, QE 2024-04-29

      When SBE mode is enabled, I noticed that when dot notation with numeric field names (ex. "a.0") is used with the find() command it doesn't always return correct results. (This came up while I was working on SERVER-49686 and doing some testing.)

      See the "Steps To Reproduce" section for a specific example. It looks like some sort of special handling is required when a field name is numeric.

            Assignee:
            martin.neupauer@mongodb.com Martin Neupauer
            Reporter:
            andrew.paroski@mongodb.com Drew Paroski
            Votes:
            0 Vote for this issue
            Watchers:
            6 Start watching this issue

              Created:
              Updated: