Uploaded image for project: 'PHP Driver: Extension'
  1. PHP Driver: Extension
  2. PHPC-849

Cursor::setTypeMap() leaks current element if called during iteration

    • Type: Icon: Bug Bug
    • Resolution: Done
    • Priority: Icon: Major - P3 Major - P3
    • 1.2.2
    • Affects Version/s: 1.1.9, 1.2.0
    • Component/s: None
    • None

      Test case:

      --TEST--
      Cursor::setTypeMap() leaks previous type map if called during iteration
      --SKIPIF--
      <?php require __DIR__ . "/../utils/basic-skipif.inc"; CLEANUP(STANDALONE) ?>
      --FILE--
      <?php
      require_once __DIR__ . "/../utils/basic.inc";
      
      $manager = new MongoDB\Driver\Manager(STANDALONE);
      
      $bulk = new MongoDB\Driver\BulkWrite();
      $bulk->insert(['_id' => 1]);
      $bulk->insert(['_id' => 2]);
      $bulk->insert(['_id' => 3]);
      $manager->executeBulkWrite(NS, $bulk);
      
      $cursor = $manager->executeQuery(NS, new MongoDB\Driver\Query([]));
      $cursor->setTypeMap(['root' => 'stdClass']);
      
      foreach ($cursor as $i => $document) {
          // Type map will apply to the next iteration, since current element is already converted
          $cursor->setTypeMap(['root' => ($i % 2 ? 'stdClass' : 'array')]);
          var_dump($document);
      }
      
      ?>
      ===DONE===
      <?php exit(0); ?>
      --EXPECTF--
      object(stdClass)#%d (%d) {
        ["_id"]=>
        int(1)
      }
      array(1) {
        ["_id"]=>
        int(2)
      }
      object(stdClass)#%d (%d) {
        ["_id"]=>
        int(3)
      }
      ===DONE===
      

            Assignee:
            jmikola@mongodb.com Jeremy Mikola
            Reporter:
            jmikola@mongodb.com Jeremy Mikola
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: